Java JFrame расстояние между овалами не равно - PullRequest
0 голосов
/ 04 февраля 2020

Мне пришлось реализовать JFrame размером 500 x 500 пикселей, который должен иметь «поле» кругов размером 9 x 9, но, как вы можете видеть на рисунке, расстояние между первой линией овалов и второй линией овалы не равны.

enter image description here

Диаметр должен составлять 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();
    }
}  

Может кто-нибудь сказать мне, что я сделал не так?

1 Ответ

1 голос
/ 05 февраля 2020

Вы действительно должны создавать подкласс JPanel, а не JFrame. И все это должно быть сделано в EventDispatchThread, а не в основном потоке. Кроме того, не используйте числа «волхвов c», такие как 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);
               }
            });
         }
      });
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...