Java JFrame 椭圆之间的距离不相等
Java JFrame distance between ovals not equal
我必须实现一个大小为 500 x 500 像素的 JFrame,它应该有一个 9 x 9 "field" 的圆圈,但是正如您在图片中看到的那样,第一行椭圆之间的距离并且第二行椭圆不相等。
直径应为 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 上完成,而不是主线程。此外,不要使用 "magic" 数字,如 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);
}
});
}
});
}
}
我必须实现一个大小为 500 x 500 像素的 JFrame,它应该有一个 9 x 9 "field" 的圆圈,但是正如您在图片中看到的那样,第一行椭圆之间的距离并且第二行椭圆不相等。
直径应为 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 上完成,而不是主线程。此外,不要使用 "magic" 数字,如 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);
}
});
}
});
}
}