Существует несколько проблем для достижения «реального» (который не может быть уменьшен) минимального размера:
- дочерние компоненты должны возвращать минимальный (в зависимости от их содержимого) минимальный размер, многие основные компоненты не
- layoutManager должен учитывать сложенный минимум всех дочерних элементов, независимо от того, насколько мало места доступно
- контейнер верхнего уровня (здесь JFrame) не должен допускать усадку сверх минимума
Первое верно для JLabel, второе встречается для SpringLayout (поэтому ярлык усекается) - третья остается основной проблемой, решение которой неочевидно, на самом деле я не знал это даже возможно до запуска примера @ mKorbel. Соответствующая строка действительно
frame.setMinimumSize(someSize);
С этой линией невозможно уменьшить рамку ниже. Без, это так. Начиная с этого наблюдения, некоторое копание приводит к тому, что документ для переопределения в Window
Устанавливает минимальный размер этого окна в постоянное значение. [..] Если
Размер текущего окна меньше минимального. Размер окна
автоматически увеличивается до минимального размера. Если setSize или
Методы setBounds впоследствии вызываются с шириной или высотой меньше
[...] автоматически увеличивается, чтобы соответствовать значению минимального размера.
Операция изменения размера может быть ограничена, если пользователь пытается изменить размер
окно ниже значения минимального размера. Это поведение зависит от платформы.
Глядя на код, есть два (реализация, не полагайтесь на них :-) детали, относящиеся к минимальному размеру
Dimension minSize;
boolean minSizeSet;
и публичный API для доступа
public Dimension getMinimumSize()
public boolean isMininumSizeSet()
первый довольно старый (jdk1.1), последний довольно новый (jdk1.5) - это означает, что первый не может полагаться на последний, но внутренне должен проверить наличие нулевого minSize. Переопределенные методы определения размера (с их гарантией приложить все усилия для соблюдения установленного вручную minSize) в Window являются самыми последними (jdk6) и do полагаются на последнее. Или другими словами: переопределение isMinimumSizeSet делает свое дело.
Некоторый фрагмент кода (будьте осторожны: это взломанный, непроверенный, вполне может зависеть от ОС с нежелательными побочными эффектами!):
// JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("some frame title") {
/**
* Overridden to tricks sizing to respect the min.
*/
@Override
public boolean isMinimumSizeSet() {
return true; //super.isMinimumSizeSet();
}
/**
* Overridden to adjust for insets if tricksing and not using
* LAF decorations.
*/
@Override
public Dimension getMinimumSize() {
Dimension dim = super.getMinimumSize();
// adjust for insets if we are faking the isMinSet
if (!super.isMinimumSizeSet() && !isDefaultLookAndFeelDecorated()) {
Insets insets = getInsets();
dim.width += insets.left + insets.right;
dim.height += insets.bottom + insets.top;
}
return dim;
}
};
// add a component which reports a content-related min
JLabel label = new JLabel("Welcome to my application!");
// make it a big min
label.setFont(label.getFont().deriveFont(40f));
frame.add(label);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);