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

У меня странная проблема. Я использую нулевой макет для окна (= JFrame и для окон), и если я использую 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());

Есть ли у кого-то идея? Почему окно изменяется?

UPDATE: То же самое здесь (скомпилируйте его с помощью 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);
    }
}

Ответ 1

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

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();
            }
        });
    }
}

ИЗМЕНИТЬ/UPDATE:

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

Ответ 2

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

Ответ 3

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

Ответ 4

Заменить:

frame.setResizable(false);

в

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

Ну, я встретил эту проблему, и это проблема Look and Feel...

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

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

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

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