в чем разница между DEFAULT_SIZE и PREFERRED_SIZE?
-
23-09-2019 - |
Вопрос
Я использую Swing GroupLayout и меня смущают значения. GroupLayout.DEFAULT_SIZE
и GroupLayout.PREFERRED_SIZE
.Я никогда не знаю, когда использовать каждый из них в таких методах, как GroupLayout.addComponent(Component, int, int, int)
.
предположим, что у меня есть этот код:
GroupLayout l = ...;
l.setHorizontalGroup(l.createSequentialGroup()
.addComponent(tf1)
.addComponent(tf2));
l.setVerticalGroup(l.createParallelGroup()
.addComponent(tf1)
.addComponent(tf2));
есть два JTextField
s в одной строке, выложенной с помощью GroupLayout
(одна последовательная группа по горизонтали и одна параллельная группа по вертикали).если я сейчас изменю размер окна, оба компонента получат доступное пространство (по 50% каждый).но я хочу, чтобы только первое текстовое поле увеличивалось/сжималось по горизонтали и только второе текстовое поле увеличивалось/сжималось по вертикали.какие значения мин, преф и Макс я должен использовать для этого?Я знаю, что могу просто попробовать и посмотреть, какая комбинация работает, но мне хотелось бы знать причину этой проблемы.
Решение
Некоторые рекомендации можно найти в Как использовать GroupLayout:Размер компонента и возможность изменения размера.Касательно DEFAULT_SIZE
и PREFERRED_SIZE
,
Их можно использовать в качестве параметров в методе.
addComponent(Component comp, int min, int pref, int max)
Чтобы заставить компонент изменять размер (разрешить уменьшение и увеличение):
group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
Это позволяет компоненту изменять размер от нулевого (минимум) до любого размера (
Short.MAX_VALUE
поскольку максимальный размер означает «бесконечный»).Если бы мы хотели, чтобы компонент не уменьшался ниже минимального размера по умолчанию, мы бы использовалиGroupLayout.DEFAULT_SIZE
вместо 0 во втором параметре.Чтобы сделать компонент фиксированным размером (подавить изменение размера):
group.addComponent(component, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)...
Интересно, что значения констант отрицательны, поэтому их нельзя принять за фактические ограничения.
Другие советы
Я также был смущен тем, как GroupLayout.DEFAULT_SIZE
и GroupLayout.PREFERRED_SIZE
используются в GroupLayout.SequentialGroup.addComponent(Component c, int min, int pref, int max)
, даже после ссылки на раздел GroupLayout в руководствах по Java и на статью java.net под названием Знакомство с GroupLayout, часть 1.
Погружаясь в JDK 1.6.0_27 GroupLayout.javasource, я нашел ответы в классе ComponentSpring.Исходя из этого, я смог выработать следующие правила:
Если необходим минимальный размер:
- и предоставленные
min
значение неотрицательно, возвращается это значение. - иначе, если это так
PREFERRED_SIZE
, мы следуем правилам предпочтительного размера. - в противном случае возвращается минимальный размер компонента.
Если необходим предпочтительный размер:
- и предоставленные
pref
значение неотрицательно, возвращается это значение. - иначе, если это так
DEFAULT_SIZE
илиPREFERRED_SIZE
, верните предпочтительный размер компонента.
Если нужен максимальный размер:
- и предоставленные
max
значение неотрицательно, возвращается это значение. - иначе, если это так
PREFERRED_SIZE
, мы следуем правилам предпочтительного размера. - в противном случае возвращается максимальный размер компонента.
Как уже заметил мусорный год, определения отрицательны.Любое другое отрицательное значение для min, pref и max, кроме DEFAULT_SIZE
или PREFERRED_SIZE
являются ошибками и подтверждают попадание.
Взаимодействие между SequentialGroup.addComponent
Минимальный, предпочтительный и максимальный размеры не были сразу понятны мне из руководства.Теперь я знаю, почему PREFERRED_SIZE,DEFAULT_SIZE,PREFERRED_SIZE
фиксировано, почему не имеет значения, равен ли средний аргумент DEFAULT_SIZE
или PREFERRED_SIZE
и как NetBeans генерировал значения фиксированного размера, например DEFAULT_SIZE,300,Short.MAX_VALUE
работа.