Вопрос
У меня есть модальное приложение JDialog
, для которого я хочу иметь обязательный минимальный размер (т.е. ОС не позволяет пользователю делать окно меньше минимального размера). Но размер окна по-прежнему должен изменяться (т.е. setResizable(false)
не вариант). Желательно, чтобы обязательный минимальный размер был определен неявно (т. е. динамически определялся минимальными размерами дочерних компонентов, а не фиксированным размером, заданным явно с помощью setMinimumSize
).
Проблема, с которой я столкнулся, заключается в том, что если я явно не установлю минимальный размер для JDialog
через setMinimumSize
, ОС не будет применять его. Таким образом, хотя JDialog
неявно знает правильный минимальный размер для использования в любой момент времени, этот размер не будет применяться, если я не вызову что-то вроде dlg.setMinimumSize(dlg.getMinimumSize())
. См. SSCCE ниже.
Во многих случаях достаточно явно задать минимальный размер непосредственно перед открытием диалогового окна. Однако иногда у меня возникает ситуация, когда неявный минимальный размер может измениться, пока диалоговое окно открыто, например. дочерний компонент может быть динамически добавлен или удален из диалогового окна. И если я установлю явный минимальный размер в диалоговом окне, этот размер может оказаться недостаточно большим для нового макета.
Есть ли способ настроить JDialog
для обеспечения неявного минимального размера диалогового окна? Если нет, есть ли какой-нибудь другой элегантный способ обеспечить динамическое изменение минимального размера в открытом диалоговом окне?
SSCCE
В этом SSCCE цель состоит в том, чтобы создать диалоговое окно, размер которого не может быть меньше 300x300 пикселей. Эта цель достигается только в том случае, если минимальный размер задан явно.
public class SSCCE {
public static void main(String[] args) {
JDialog dlg = new JDialog(null, ModalityType.APPLICATION_MODAL);
dlg.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
JPanel pnl = new JPanel(new BorderLayout());
pnl.add(new JLabel("300x300"), BorderLayout.CENTER);
// The panel is given a hard-coded minimum size just to make the
// problem easier to see
pnl.setMinimumSize(new Dimension(300,300));
dlg.add(pnl);
System.out.println("Dialog minimum size: " + dlg.getMinimumSize());
// Minimum size is not enforced by the OS without this call
dlg.setMinimumSize(dlg.getMinimumSize());
System.out.println("Dialog minimum size: " + dlg.getMinimumSize());
dlg.pack();
dlg.setVisible(true);
}
}
С явным вызовом setMinimumSize
:
Без явного вызова setMinimumSize
:
Вывод в обоих случаях:
Минимальный размер диалогового окна: java.awt.Dimension[width=300,height=300]
Минимальный размер диалогового окна: java.awt.Dimension[width=300,height=300]
Для чего это стоит - я наблюдал это на Windows 8.1 с jdk1.8.0_91.
JPanel
, чтобы имитировать некоторый элемент управления или контейнер, который имеет неотъемлемый минимальный размер, например JLabel или JTable. Минимальные размеры распространяются через менеджеры компоновки вверх — поскольку панель имеет минимальный размер 300x300, то и диалог должен иметь минимальный размер 300x300. Но ОС не применяет это, если только я явно не устанавливаю минимальный размер с помощью вызоваJDialog.setMinimumSize()
. - person Kevin K   schedule 09.11.2016