2011-06-26 2 views
4

У меня есть JFrame с GridBagLayout. Пользователь может изменить размер этого окна. Кроме того, он может выполнять некоторые действия по редактированию, которые изменяют размер окна. После таких действий я использую pack(); repaint();. Но на самом деле я не должен делать окно меньше после таких операций - только больше. То, что я нашел в качестве решения, -Упаковка, но не уменьшайте ее

Dimension oldSize = getSize(); 
    pack(); 
    Dimension newSize = window.getSize(); 
    setSize(
      (int) Math.max(newSize.getWidth(), oldSize.getWidth()), 
      (int) Math.max(newSize.getHeight(), oldSize.getHeight())); 
    repaint(); 

Но мне это совсем не нравится. Помимо уродливого кода, мы устанавливаем размер дважды (один раз по пачке и напрямую). Есть ли другие решения?

+1

Как насчет 'setMinimumSize' перед' пакетом'? –

+0

@ Paŭlo Ebermann, спасибо большое. Это то, что мне нужно. Пожалуйста, опубликуйте его как ответ. –

+0

сделано (немного больше текста). –

ответ

9

простое решение было бы использовать что-то вроде этого:

frame.setMinimumSize(frame.getSize()); 
frame.pack(); 
frame.setMinimumSize(null); 

Это не позволит pack() сделать окно меньше, только больше, я думаю. Посредством сброса минимального размера до null после pack() мы избегаем предотвращения изменения размера пользователя после этого.

В конце вам не понадобится repaint(), изменение размера должно инициировать перерисовку самостоятельно. (Конечно, убедитесь, что все эти действия происходят в отправке потоке событий.)

+0

На Ubuntu это приводит к тому, что моя форма перемещается на 10-20 пикселей вверх (это странно). – Danon

0

Чтобы это сделать, вы можете переопределить метод pack(). Не уверен, что есть лучший способ.

1

Альтернативное решением предложенного PAULO является следующим кодом:

private boolean greater(Dimension left, Dimension right) { 
    return left.getHeight() > right.getHeight() || left.getWidth() > right.getWidth(); 
} 

if (greater(window.getPreferredSize(), window.getSize())) { 
    window.pack(); 
} 

Преимущество этого решения заключается в том, что пакет не вызывается, если это не необходимо, и это позволяет избежать мерцания, которое мы наблюдаем в Linux с решением Paŭlo.

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