2012-06-27 10 views
15

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

Два 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); 
    } 
} 
+0

вы получите лучше и быстрее ответы, если вы показать [SSCCE] (http://sscce.org). – assylias

+0

есть пример, не могу вставить остальные, потому что за ним работает xml-парсер и многое другое ... и проблема только с вызовом setResizable – immerhart

+0

Я не могу воспроизвести поведение. Поэтому постарайтесь избавиться от всех ненужных частей и опубликуйте компилируемый и исполняемый пример, в котором указано поведение. – assylias

ответ

13

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

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:

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

+0

То же самое здесь ...... – assylias

+1

Я думаю, вы должны запустить оба окна, тогда вы увидите, что размер не изменен! – immerhart

+1

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

1

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

+0

В моем случай, без каких-либо других настроек L & F, например, со стандартным внешним видом и изменением размера окна. – FaithReaper

1

Заменить:

frame.setResizable(false); 

к:

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

Проблема сохраняется. Это не решение. – FaithReaper

4

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

+0

Нет, он продолжает давать мне разницу между двумя JFrames. – FaithReaper

0

Пока что лучший патч для этой досадной проблемы заключается в следующем. Не имеет значения, где вы называете метод 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().

0

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

1

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

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

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

свой вопрос и мой ответ с GIF здесь:

Swing - setResizable(true) make JFrame title bar higher and window size smaller

Смежные вопросы