Как максимизировать эффект клеев Box? / Как расставить приоритеты предпочтительных размеров компонентов над другими?
Настроить:
На правой стороне экрана есть список сверху вниз.На левой стороне экрана есть манипуляторы для этого списка;один манипулятор состоит из двух элементов, один рядом с другим.сначала существует только один манипулятор, но могут появиться и другие;те были бы тогда помещены ниже друг друга.Здесь элементы манипулятора - это JComboBoxes:sourceAMask
а такжеsourceBMask
.
Чтобы они появлялись рядом, я заключил их вBox mask_initialPair
выложены вдольBoxLayout.X_AXIS
, Они должны быть выровнены по левому краю, поэтому я добавил справаBox.createHorizontalGlue
.
Позволятьmask_initialPair
чтобы быть вертикально растянутым, я заключил, что вBox maskPairs
выложены вдольBoxLayout.Y_AXIS
и добавилBox.createVerticalGlue
под этим.
Чтобы поместить этот вертикальный список рядом с другим,targetScroller
Я вложил оба вBox maskPage
выложены вдольBoxLayout.X_AXIS
, Эта конструкция должна отображаться по центру, поэтому я добавляю слева и справаBox.createHorizontalGlue
.
Мои (идеальные) предположения:
sourceAMask
а такжеsourceBMask
выровнены по левому краю и минимальной необходимой ширины (по наибольшей длине отsource[A|B]Package
), поскольку горизонтальный клей справа занимает все пространство, назначенноеmaskPairs
.mask_initialPair
(и все последующие пары) имеет минимально необходимую высоту (в соответствии с текущим размером используемого шрифта), так как вертикальный клей ниже занимает все дальнейшее пространство.Левые и правые поляmaskPage
имеют одинаковую ширину.maskPairs
а такжеtargetScroller
имеют одинаковую ширину.Только 3 держит.
4 нарушается какmaskPairs
гораздо шире, чемtargetScroller
потому что (нарушая 1), горизонтальный клей внутриmask_initialPair
получает равную ширину клея вmaskPage
как будто вставлено междуmaskPairs
а такжеtargetScroller
а не как частьmaskPairs
.
2 нарушается какmask_initialPair
имеет равную высоту клея под ним.
Вопрос:
Я понимаю, как происходит горизонтальное смещение.Я не понимаю, почему происходит растяжение (в обоих измерениях) видимых компонентов, несмотря на то, что всегда есть клей, чтобы занять лишнее пространство.В обоих случаях:Как я могу это исправить?
В идеале без переопределения всех классов и раздувания моего кода по размеру снова.
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);
}
}