【问题标题】:Java JFrame distance between ovals not equal椭圆之间的Java JFrame距离不相等
【发布时间】:2020-02-04 20:23:17
【问题描述】:

我必须实现一个大小为 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();
    }
}  

谁能告诉我我做错了什么?

【问题讨论】:

  • 首先,请覆盖paintComponent() 而不是paint(): docs.oracle.com/javase/tutorial/uiswing/painting/closer.html
  • 另外请检查您的要求:偏移 60 像素的 9x9 圆网格需要 560 像素,而不是 500 像素,否则将不适合。我认为您的问题与此有关。你必须把最后一行挤进去。
  • 或者... 40 像素在中心上的距离意味着圆圈应该偏移 40 像素,而不是 60。
  • @markspace 两者都试过了,但似乎都没有解决...
  • g.drawOval(i, 20, 20, 20);g.fillOval(i, 20, 20, 20); 这些行是干什么用的? drawOval(int x, int y, int width, int height) 方法表明,每次通过内循环,您都会在 y=20 处创建一个椭圆。

标签: java swing jframe pixel oval


【解决方案1】:

你真的应该继承 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);
               }
            });
         }
      });
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2022-01-06
    • 1970-01-01
    • 2015-08-17
    相关资源
    最近更新 更多