2

Javaで長方形を描いてみます。フレームサイズ(800,400)とサイズ変更可能な(false)長方形のx = 50、y =50幅=700高さ=300を設定しました。なぜ中央にないのですか?ありがとうございました。

4

2 に答える 2

7

他に証拠がなければ、あなたはaのような方法を無効にして、それに直接ペイントしていると思います。paintJFrame

問題は、フレームに装飾(たとえば、境界線とタイトルバー)があり、フレームのスペースを占めることです...

ここに画像の説明を入力してください

技術的には、これは正しいです。長方形はフレームの中央に描かれていますが、フレームの装飾のため、少し高いように見えます...

代わりに、フレームのコンテンツ領域にペイントする必要があります。

ここに画像の説明を入力してください

ここで、長方形は正しく中央に配置されているように見えます。私のテストでは、最初のフレーム(不良)を800x400に設定し、2番目のフレームのコンテンツペインの推奨サイズを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これは、多くの理由の1つであり、トップレベルのコンテナのメソッドをオーバーライドしてはならない理由です;)

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

これは正常に機能するはずです。メンバー変数にアクセスする前に、Rectangleの新しいインスタンスを作成していますか?

また、800 x 400は奇妙な解像度で、800x600がより標準的です。

于 2012-12-05T23:05:12.000 に答える