qual é a diferença entre DEFAULT_SIZE e PREFERRED_SIZE?
-
23-09-2019 - |
Pergunta
Estou usando Swing GroupLayout e estou confuso com os valores GroupLayout.DEFAULT_SIZE
e GroupLayout.PREFERRED_SIZE
.Nunca sei quando usar cada um deles em métodos como GroupLayout.addComponent(Component, int, int, int)
.
suponha que eu tenha este código:
GroupLayout l = ...;
l.setHorizontalGroup(l.createSequentialGroup()
.addComponent(tf1)
.addComponent(tf2));
l.setVerticalGroup(l.createParallelGroup()
.addComponent(tf1)
.addComponent(tf2));
há dois JTextField
está em uma única linha disposta com GroupLayout
(um grupo sequencial horizontalmente e um grupo paralelo verticalmente).se eu redimensionar a janela agora, ambos os componentes obterão o espaço disponível (50% cada).mas quero que apenas o primeiro campo de texto cresça/diminua horizontalmente e apenas o segundo campo de texto cresça/diminua verticalmente.quais valores de min, preferência e máx. devo usar para conseguir isso?Eu sei que posso tentar e ver qual combinação funciona, mas gostaria de saber o raciocínio por trás desse problema.
Solução
Algumas orientações podem ser encontradas em Como usar o GroupLayout:Tamanho e redimensionamento do componente.A respeito de DEFAULT_SIZE
e PREFERRED_SIZE
,
Eles podem ser usados como parâmetros no método
addComponent(Component comp, int min, int pref, int max)
Para forçar o redimensionamento de um componente (permitir diminuir e aumentar):
group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
Isso permite que o componente seja redimensionado entre tamanho zero (mínimo) e qualquer tamanho (
Short.MAX_VALUE
já que tamanho máximo significa "infinito").Se quiséssemos que o componente não diminuísse abaixo do tamanho mínimo padrão, usaríamosGroupLayout.DEFAULT_SIZE
em vez de 0 no segundo parâmetro.Para tornar um componente de tamanho fixo (suprimir o redimensionamento):
group.addComponent(component, GroupLayout.PREFERRED_SIZE,
GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE)...
Curiosamente, os valores constantes são negativos, portanto não podem ser confundidos com restrições reais.
Outras dicas
Eu também estava confuso sobre como GroupLayout.DEFAULT_SIZE
e GroupLayout.PREFERRED_SIZE
são usados em GroupLayout.SequentialGroup.addComponent(Component c, int min, int pref, int max)
, mesmo depois de consultar a seção GroupLayout dos Tutoriais Java e um artigo java.net intitulado Conhecendo o GroupLayout, parte 1.
Mergulhando no JDK 1.6.0_27 GroupLayout.javasource, encontrei as respostas na classe ComponentSpring.A partir disso consegui elaborar estas regras:
Se for necessário um tamanho mínimo:
- e o fornecido
min
o valor não for negativo, esse valor será retornado. - senão se for
PREFERRED_SIZE
, seguimos as regras de tamanho preferido. - caso contrário, o tamanho mínimo do componente será retornado.
Se um tamanho preferido for necessário:
- e o fornecido
pref
o valor não for negativo, esse valor será retornado. - senão se for
DEFAULT_SIZE
ouPREFERRED_SIZE
, retorne o tamanho preferido do componente.
Se for necessário um tamanho máximo:
- e o fornecido
max
o valor não for negativo, esse valor será retornado. - senão se for
PREFERRED_SIZE
, seguimos as regras de tamanho preferido. - caso contrário, o tamanho máximo do componente será retornado.
Como trashgod já observou, as definições são negativas.Qualquer outro valor negativo para min, pref e max além DEFAULT_SIZE
ou PREFERRED_SIZE
são erros e afirmações de acerto.
A interação entre o SequentialGroup.addComponent
Os tamanhos min, pref e max não ficaram imediatamente aparentes para mim no tutorial.Agora eu sei por que PREFERRED_SIZE,DEFAULT_SIZE,PREFERRED_SIZE
é fixo, por que não importa se o argumento do meio é DEFAULT_SIZE
ou PREFERRED_SIZE
e como o NetBeans gerou valores de tamanho fixo como DEFAULT_SIZE,300,Short.MAX_VALUE
trabalhar.