java - 椭圆之间的Java JFrame距离不相等
问题描述
我必须实现一个大小为 500 x 500 像素的 JFrame,它应该有一个 9 x 9 的圆形“场”,但正如您在图片中看到的那样,第一行椭圆和第二行椭圆之间的距离是不相等。
直径应该是 20 像素,一个椭圆的中心到另一个椭圆的距离应该是 40 像素,但我不知道我这样做是否正确:
import javax.swing.JFrame;
import java.awt.Graphics;
import java.awt.Color;
public class KreisFrame extends JFrame {
public KreisFrame() {
//Set JFrame size
setSize(500,500);
//Make JFrame visible
setVisible(true);
}
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.GREEN);
g.fillRect(0, 0, 500, 500);
for (int j = 0; j < 500; j += 60){
for (int i = 0; i < 500; i += 60) {
// draw circle
g.drawOval(i, 20, 20, 20);
g.drawOval(i, j, 20, 20);
// fill circle
g.fillOval(i, 20, 20, 20);
g.fillOval(i, j, 20, 20);
g.setColor(Color.BLUE);
}
}
}
public static void main(String[]args) {
KreisFrame myframe = new KreisFrame();
}
}
有人可以告诉我我做错了什么吗?
解决方案
你真的应该继承 JPanel,而不是 JFrame。所有这些都应该在 EventDispatchThread 上完成,而不是在主线程上。此外,不要使用像 500、20 和 40 这样的“神奇”数字。这是一个绘制整个面板的解决方案,无论它是什么大小(请注意,这里没有在面板上设置边框的规定)。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class Kreis extends JPanel {
protected int dia = 20;
protected int sep = 40;
public Kreis() {
// Set JFrame size
setPreferredSize(new Dimension(500, 500));
setBackground(Color.green);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
g.setColor(Color.BLUE);
for (int y = 0; y < d.height; y += sep) {
for (int x = 0; x < d.width; x += sep) {
// draw circle
g.fillOval(x, y, dia, dia);
}
}
}
public static void main(final String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
// Create and set up the window.
JFrame jf = new JFrame();
Kreis panel = new Kreis();
jf.add(panel);
jf.pack();
jf.setVisible(true);
jf.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing( WindowEvent arg0) {
System.exit(0);
}
});
}
});
}
}
推荐阅读
- google-cloud-platform - Google Speech to Text(语音识别)仅识别音频的前几秒
- sql - 无法从 vb.net 更新 MS Access 数据库
- java - 安装elasticsearch插件时Java版本检查器错误分析-拼音
- python - TypeError:“队列”对象不可迭代
- html - Apps脚本通过按钮从另一个html表单打开html表单
- javascript - 在类方法之间共享变量
- regex - 使用 pandas 时是否可以用 regex 包替换 re 包?
- php - 如何阻止 mkdir() 文件将“守护进程”设置为管理员
- linux-kernel - 硬件断点只能在模块初始化时设置
- javascript - 从字符串中获取嵌套对象中的某个值