6

600x600 の ContentPanel で JFrame を作成するつもりでしたが、JFrame のサイズを変更できないようにしたかったのです。このボックス内に、プログラムを実行したときにすべてが一致するように、600x600 の赤枠の長方形を描きました。JFrame のサイズ変更を制限する前に、次のようにして JFrame のサイズを設定します。

getContentPane().setPreferredSize( new Dimension(600,600));
pack();

そして、プログラムを起動すると、長方形の境界が JFrame の寸法と完全に一致しました。ただし、 isResizable(false) を式に追加すると、長方形の右端と長方形の下端の間にピクセルのバッファーがあるように見えました。少し試行錯誤すると、 isResizable(false) が高さと幅に 10 ピクセルを追加するように見えます。(したがって、contentPane のサイズが 590x590 + 余分な 10 が私の回避策です)

私の質問 これはなぜですか? 余分な 10 ピクセルに関するドキュメントがどこにも見つからないようです。

注: この異常は、サイズを変更せずに JFrame を作成した場合にも観察されました。サイズ変更不可にしないと、監視可能なパネル/contentPane はありませんが、isResizable(false) を使用すると、パネル/ペインの一部が表示されます。

4

1 に答える 1

6

そうです、フレームを un-resiable に設定すると、その高さと幅に 10 ピクセルが追加されるように見えますが、その理由はわかりません。これは、ネイティブ ピアを更新することの副作用のようですが...

JFrame#pack通話後の通話でリセットできますJFrame#setResizable

public class TestResizableFrame {

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

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

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new FixedPane());
                frame.setResizable(false);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class FixedPane extends JPanel {

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

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            Dimension size = getSize();
            String text = size.width + "x" + size.height;
            FontMetrics fm = g.getFontMetrics();
            int x = (getWidth()- fm.stringWidth(text)) / 2;
            int y = ((getHeight() - fm.getHeight()) / 2) + fm.getAscent();
            g.drawString(text, x, y);
            g.setColor(Color.RED);
            g.drawRect(0, 0, getWidth() - 1, getHeight() - 1);
        }

    }

}
于 2012-11-22T06:35:15.620 に答える