Como maximizar o efeito das colas Box? / Como priorizar os tamanhos preferidos dos componentes em detrimento de outros?
Configuração:
No lado direito da tela, há uma lista de cima para baixo.No lado esquerdo da tela, existem manipuladores para esta lista;um manipulador consiste em dois elementos, um ao lado do outro.a princípio, apenas um manipulador existe, mas outros podem aparecer;esses seriam então colocados um abaixo do outro.Aqui, os elementos dos manipuladores são JComboBoxes:sourceAMask
esourceBMask
.
Para garantir que eles apareçam lado a lado, coloquei-os noBox mask_initialPair
dispostos ao longo doBoxLayout.X_AXIS
. Eles devem aparecer alinhados à esquerda, então eu preenchi a direita com umBox.createHorizontalGlue
.
Permitirmask_initialPair
para não ser esticado verticalmente, incluí que noBox maskPairs
dispostos ao longo doBoxLayout.Y_AXIS
e adicionou umBox.createVerticalGlue
abaixo dele.
Para colocar esta lista vertical ao lado da outra,targetScroller
, Incluí tanto noBox maskPage
dispostos ao longo doBoxLayout.X_AXIS
. Essa construção deve aparecer centralizada, então eu preenchi a esquerda e a direita comBox.createHorizontalGlue
.
Minhas suposições (ideais):
sourceAMask
esourceBMask
alinhados à esquerda e de largura mínima necessária (conforme o maior comprimentosource[A|B]Package
), pois a cola horizontal à direita ocupa todo o espaço adicional atribuído amaskPairs
.mask_initialPair
(e todos os pares adicionais) tem a altura mínima necessária (conforme o tamanho atual da fonte usada), pois a cola vertical abaixo ocupa todo o espaço adicional.As margens esquerda e direita demaskPage
são de igual largura.maskPairs
etargetScroller
são de igual largura.Apenas 3 são válidos.
4 é violado comomaskPairs
é muito maior quetargetScroller
, porque (violando 1), a cola horizontal dentromask_initialPair
recebe largura igual às colas emmaskPage
, como se inserido entremaskPairs
etargetScroller
, em vez de como parte demaskPairs
.
2 é violado comomask_initialPair
tem a mesma altura da cola abaixo dela.
Pergunta, questão:
Eu entendo como o desalinhamento horizontal acontece.Não entendo por que o alongamento (em ambas as dimensões) dos componentes visíveis ocorre, apesar de sempre haver cola para ocupar o excesso de espaço.Em ambos os casos:Como posso corrigir isso?
Idealmente, sem substituir todas as classes e inflar meu código por seu tamanho novamente.
import javax.swing.*;
class Test
{
public static void main(String[] args)
{
String[] sourceAPackage = { "A::entry1", "A::entry2", "A::entry3" };
String[] sourceBPackage = { "B::entry1", "B::entry2" };
String[] targetPackage = {};
JList<String> targetList = new JList<String>(targetPackage);
JScrollPane targetScroller = new JScrollPane(targetList);
JComboBox sourceAMask = new JComboBox<String>(sourceAPackage);
JComboBox sourceBMask = new JComboBox<String>(sourceBPackage);
sourceAMask.setEditable(true);
sourceBMask.setEditable(true);
Box mask_initialPair = new Box(BoxLayout.X_AXIS);
mask_initialPair.add(sourceAMask);
mask_initialPair.add(sourceBMask);
mask_initialPair.add(Box.createHorizontalGlue());
Box maskPairs = new Box(BoxLayout.Y_AXIS);
maskPairs.add(mask_initialPair);
maskPairs.add(Box.createVerticalGlue());
Box maskPage = new Box(BoxLayout.X_AXIS);
maskPage.add(Box.createHorizontalGlue());
maskPage.add(maskPairs);
maskPage.add(targetScroller);
maskPage.add(Box.createHorizontalGlue());
JFrame frame = new JFrame();
frame.add(maskPage);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}