Въпрос
Имам модално приложение 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