2

我尝试在 Java 中绘制一个矩形。我设置了frame size (800,400) and resizable(false) rectangle的x = 50, y = 50 width = 700 height = 300。为什么不在中间呢?谢谢你。

4

2 回答 2

7

没有任何其他证据,我你已经覆盖了paint类似 a 的方法JFrame并直接对其进行绘画。

问题是,框架有装饰(例如边框和标题栏),它占用了框架的空间......

在此处输入图像描述

从技术上讲,这是正确的。矩形画在画框的中央,但是因为画框的装饰,看起来有点高……

相反,您应该在框架的内容区域上进行绘画。

在此处输入图像描述

在这里,矩形现在看起来正确居中。在我的测试中,我将第一帧(坏)设置为 800x400,我将第二帧的内容窗格的首选尺寸设置为 800x400,这使得帧尺寸实际上是 816x438,因为帧的装饰现在位于绘制区域之外

public class CenterOfFrame {

    public static void main(String[] args) {
        new CenterOfFrame();
    }

    public CenterOfFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                new BadFrame().setVisible(true);

                JFrame goodFrame = new JFrame();
                goodFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                goodFrame.setContentPane(new PaintablePane());
                goodFrame.pack();
                goodFrame.setLocationRelativeTo(null);
                goodFrame.setVisible(true);

            }
        });
    }

    public class BadFrame extends JFrame {

        public BadFrame() {
            setSize(800, 400);
            setDefaultCloseOperation(EXIT_ON_CLOSE);
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);
            paintTest(g, getWidth() - 1, getHeight() - 1);
        }
    }

    public void paintTest(Graphics g, int width, int height) {
        g.setColor(Color.RED);
        g.drawLine(0, 0, width, height);
        g.drawLine(width, 0, 0, height);
        g.drawRect(50, 50, width - 100, height - 100);
    }

    public class PaintablePane extends JPanel {

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(800, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g); //To change body of generated methods, choose Tools | Templates.
            paintTest(g, getWidth() - 1, getHeight() - 1);
        }
    }
}

这就是为什么您不应该覆盖paint顶级容器的方法的众多原因之一;)

于 2012-12-05T23:19:41.163 回答
0
    Rectangle rect = new Rectangle(50,50,700,300); 

那应该可以正常工作,您是否在访问成员变量之前创建了一个新的 Rectangle 实例?

800 x 400 也是一种奇怪的分辨率,800 x 600 更标准。

于 2012-12-05T23:05:12.000 回答