Java setResizable (false) изменяет размер окна (swing)
у меня странная проблема. Я использую нулевой макет для окна (=JFrame и в windows), и если я использую setResizable (false), размер окна становится больше (справа и внизу, около 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());
есть ли у кого-нибудь идея? Почему размер окна изменяется?
обновление: То же самое здесь (скомпилируйте его с и без setResizable и чем вы можете это увидеть, если вы перекрываете окна):
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);
}
}
7 ответов
Он не меняется на моем примере, поэтому у вас должно быть что-то еще, что вызывает вашу проблему:
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();
}
});
}
}
ИЗМЕНИТЬ/ОБНОВИТЬ:
каким-то образом вставки неверны, когда вы устанавливаете изменяемое значение false (по крайней мере, в Windows 7 и JDK 6). Каким-то образом они меняются от 30,8,8,8 до 25,3,3,3, хотя граница (которая окрашена ОС) остается фактически неизменной. Поскольку вставки являются частью границ кадра, кадр на самом деле слишком большой (визуально), когда он не может быть изменен. Для мне кажется, что в вычисленных вставках есть ошибка, когда кадр не изменяется.
Если вы установите setResizable false перед установкой границ, у вас не будет проблемы. как заявил ранее Гергели Силаги, вы избавляетесь от полос прокрутки, но размер окна заблокирован, и поэтому вы получаете 9 или 10 пикселей дополнительного пространства в кадре. У меня была та же проблема. спасибо за помощь.
в зависимости от настройки L&F изменение размера(false/true) может изменить оформление границы окна. Нет максимизации, нет стрелки изменения размера. Что само по себе может изменить размер.
заменить:
frame.setResizable(false);
в:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
frame.setResizable(false);
}
});
Ну, я встретил эту проблему, и это проблема Look & Feel...
почему изменяемый размер кадра имеет вставки (5, 5, 5, 5)? Это заставляет меня думать, что make it resizable добавляет дополнительный компонент вокруг кадра, например... какой-то" обработчик " для перетаскивания для изменения размера?
и тогда я обнаружил, что если мы используем Java Metal L&f по умолчанию и set setDefaultLookAndFeelDecorated(true)
, обработчик будет окрашен и, таким образом, рамка не изменит размер. Но в Nimbus, Motif и Windows L&F этот пункт не реализован, так что это ошибка. Я доложу об этом.
мой собственный вопрос и мой ответ с GIF здесь:
Swing-setResizable (true) делает строку заголовка JFrame выше и размер окна меньше
до сих пор лучшим патчем для этой раздражающей проблемы является следующее. Не имеет значения, где вы называете 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 подкласса JFrame. Если я запускаю фрейм проблемы в автономном приложении, размер фрейма правильный. Если я запускаю оба фрейма в автономном приложении, фрейм проблемы все еще больше. Я сделал setResizable (false) перед pack, и я все еще получаю проблему. Мой обходной путь состоял в том, чтобы изменить макет на BorderLayout и шлепнуть панель (изображение) в центре, а затем сделать setResizable.