Проблема с размером JFrame isResizable (false)

Я намеревался создать JFrame с ContentPanel размером 600x600 и хотел, чтобы размер JFrame не изменялся. Внутри этой коробки я нарисовал прямоугольник 600x600 с красным контуром, чтобы убедиться, что все совпало, когда я запустил программу. Прежде чем ограничить изменение размера JFrame, я установил размер своего JFrame, выполнив следующие действия:

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

И когда я запустил программу, границы моего прямоугольника идеально совпали с размерами JFrame. Однако, когда я добавил isResizable(false) в уравнение, казалось, что между правым краем моего прямоугольника, а также нижним краем моего прямоугольника есть буфер пикселей. Путем проб и ошибок получается, что isResizable(false) добавляет 10 пикселей к высоте и ширине. (Таким образом, размер 590x590 для contentPane + дополнительные 10 - это мой обходной путь)

Мои вопросы, почему это? Кажется, я нигде не могу найти документацию о дополнительных 10 пикселях?

Примечание. Эта аномалия также наблюдалась при создании JFrame без изменения размера. Если не сделать его неизменяемым, видимой панели/панели содержимого не будет, но когда используется isResizable(false), будет видна часть панели/панели.


person user1034846    schedule 22.11.2012    source источник
comment
Вы уверены, что сделали его неизменяемым перед вызовом пакета?   -  person full.stack.ex    schedule 22.11.2012


Ответы (1)


Вы правы, установка фрейма на ненадежный, кажется, добавляет 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);
        }

    }

}
person MadProgrammer    schedule 22.11.2012