Java setResizable (false) изменяет размер windows (swing)

У меня странная проблема. Я использую нулевой макет для windows (= JFrame и для окон), и если я использую setResizable (false), размер windows становится больше (справа и внизу, около 10 пикселей, я бы сказал). Я не знаю почему.

Два println возвращают одинаковые размеры, что странно, также …

mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWnd.setTitle(wndTitle); mainWnd.setBounds(wndPosX, wndPosY, wndWidth, wndHeight); System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); mainWnd.setResizable(false); System.out.println(mainWnd.getHeight() + mainWnd.getWidth()); 

У кого-то есть идея? Почему изменяется размер windows?

ОБНОВЛЕНИЕ. То же самое здесь (скомпилируйте его с помощью setResizable и без него, и вы можете увидеть его, если вы перекрываете windows):

 import javax.swing.JFrame; import javax.swing.JPanel; public class Main { private static JFrame mainWnd = null; public static void main(String[] args) { mainWnd = new JFrame(); mainWnd.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainWnd.setTitle("asda"); mainWnd.setBounds(50, 50, 300, 300); mainWnd.setResizable(false); mainWnd.setVisible(true); } } 

На моем примере это не меняется, поэтому у вас должно быть что-то еще, что вызывает вашу проблему:

 import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Test4 { protected static void initUI() { JFrame frame = new JFrame("test"); frame.setBounds(0, 0, 300, 200); frame.setVisible(true); System.err.println(frame.getSize()); frame.setResizable(false); System.err.println(frame.getSize()); } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { initUI(); } }); } } 

EDIT / UPDATE:

Каким-то образом вставки неверны, когда вы устанавливаете изменяемый размер в false (по крайней мере, на Windows 7 и JDK 6). Так или иначе они меняются от 30,8,8,8 до 25,3,3,3, хотя граница (которая окрашена ОС) остается на самом деле одинаковой. Поскольку вставки являются частью границ кадра, кадр на самом деле слишком большой (визуально), когда он не изменяется. Для меня это похоже на ошибку в вычисленных вставках, когда кадр не изменяется.

Если вы установите setResizable false перед установкой границ, у вас не будет проблемы. как ранее заявлял Гергили Ссилаги, вы избавляетесь от полос прокрутки, но размер windows заблокирован, и поэтому вы получаете 9 или 10 пикселей дополнительного пространства в кадре. У меня была такая же проблема. Спасибо за помощь.

В зависимости от настройки L & F изменяемый размер (false / true) может изменить декорации границ windows. Без увеличения, без изменения размера стрелки. Это само по себе может resize.

Заменить:

 frame.setResizable(false); 

чтобы:

  SwingUtilities.invokeLater(new Runnable() { public void run() { frame.setResizable(false); } }); 

Ну, я столкнулся с этой проблемой, и это проблема Look & Feel …

Почему у изменяемого размера frameworks есть вставки (5, 5, 5, 5)? Это заставляет меня думать, что сделать его изменчивым добавляет дополнительный компонент вокруг кадра, например … какой-то «обработчик» для перетаскивания ?

И затем я обнаружил, что если мы будем использовать стандартную Java Metal l & f и установить setDefaultLookAndFeelDecorated(true) , обработчик будет окрашен, и, таким образом, кадр не изменит размер. Но в Nimbus, Motif и Windows L & F этот момент не реализован, так что это ошибка. Я сообщу об этом.

Мой собственный вопрос и мой ответ с GIF:

Swing – setResizable (true) делает строку заголовка JFrame выше и размер windows меньше

Пока что лучший патч для этой досадной проблемы заключается в следующем. Не имеет значения, где вы вызываете метод setResizable(false) . Просто добавьте этот кусок кода после того, как вы setVisible(true) .

 private void sizeBugPatch() { while (frame.getWidth() > yourWidth) { frame.pack(); } } 

Где yourWidth – это ширина, которую вы установили любым из возможных способов, либо вручную, либо путем переопределения методов setPreferredSize . Объяснение довольно просто, frame.pack() похоже, как-то сбрасывает frame.setResizable(boolean b) . Вы можете использовать if вместо цикла while, но я предпочитаю while чтобы исключить случай, когда окно будет по-прежнему быть вне размера даже после второго pack() .

У меня есть 2 подclassа JFrame. Если я запускаю проблему в автономном приложении, размер кадра правильный. Если я запускаю оба фрейма в автономном приложении, проблема будет еще больше. Я сделал setResizable (false) перед пакетом, и у меня все еще проблема. Мое обходное решение состояло в том, чтобы изменить макет на BorderLayout и повернуть панель (изображение) в центр, затем выполнил setResizable.