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);
               }
            });
         }
      });
   }
}