Почему связанные компоненты не могут быть изменены в GroupLayout?
Для графического интерфейса приложения калькулятора, которое я делаю, у меня есть сетка JButton
объекты, где все они имеют одинаковый размер, за исключением того, что один в два раза больше ширины остальных. Это должно выглядеть примерно так (за исключением того, что линии будут прямыми):
Первой моей мыслью было бы определить размер для JButton
объекты (давайте назовем это CELL_SIZE
), а затем установите предпочтительный размер кнопок на CELL_SIZE
кроме более длинной кнопки CELL_SIZE * 2
, Это работает, пока вы не измените размер окна. Я хочу, чтобы кнопки сами меняли размеры, чтобы при всех размерах окна все кнопки были одинакового размера, кроме более длинных. Поэтому я попытался с помощью linkSize
со всеми кнопками, кроме длинной, в качестве аргументов. Но размер кнопок не изменился! Затем я прочитал в Javadoc, что linkSize
предотвращает изменение размеров компонентов. Почему это? Могу ли я использовать этот метод для выполнения этого макета, или мне нужно что-то еще?
Ниже приведен класс, который я напечатал, чтобы продемонстрировать проблему (реальное приложение переполнено другими функциями, кроме макета). Оно имеет всего 5 кнопок и служит для представления левой нижней области изображения 3x2.
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
class A extends JPanel{
public static final int CELL_SIZE = 32;
JButton b1 = new JButton("1");
JButton b2 = new JButton("2");
JButton b3 = new JButton("3");
JButton b4 = new JButton("4");
JButton b5 = new JButton("5");
public A(){
GroupLayout layout = new GroupLayout(this);
layout.setHorizontalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup()
.addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE)
.addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE)
).addGroup(layout.createParallelGroup()
.addGroup(layout.createSequentialGroup()
.addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE)
.addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE)
)
.addComponent(b5, 0, CELL_SIZE * 2, Short.MAX_VALUE)
)
);
layout.setVerticalGroup(layout.createSequentialGroup()
.addGroup(layout.createParallelGroup()
.addComponent(b1, 0, CELL_SIZE, Short.MAX_VALUE)
.addComponent(b3, 0, CELL_SIZE, Short.MAX_VALUE)
.addComponent(b4, 0, CELL_SIZE, Short.MAX_VALUE)
).addGroup(layout.createParallelGroup()
.addComponent(b2, 0, CELL_SIZE, Short.MAX_VALUE)
.addComponent(b5, 0, CELL_SIZE, Short.MAX_VALUE)
)
);
layout.linkSize(b1, b2, b3, b4);
setLayout(layout);
}
private static void createAndShowGUI(){
JFrame f = new JFrame("GroupLayout Test");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new A());
f.pack();
f.setVisible(true);
}
public static void main(String[] args){
SwingUtilities.invokeLater(new Runnable(){
@Override
public void run(){
createAndShowGUI();
}
});
}
}
РЕДАКТИРОВАТЬ: если я позвоню addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
и удалите linkSize
звоните, тогда размеры кнопок становятся странными. b1
а также b2
стать шире, чем b3
а также b4
но не так широко, как b5
,
1 ответ
Из учебника Oracle:
1) Чтобы изменить размер компонента (разрешить сжатие и рост):
group.addComponent(component, 0, GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) ...
Это позволяет компоненту изменять размер от нулевого размера (минимального) до любого размера (Short.MAX_VALUE, поскольку максимальный размер означает "бесконечный"). Если бы мы хотели, чтобы компонент не уменьшался ниже своего минимального размера по умолчанию, мы использовали бы GroupLayout.DEFAULT_SIZE вместо 0 во втором параметре.
2) Чтобы сделать компонент фиксированного размера (подавить изменение размера):
group.addComponent(component, GroupLayout.PREFERRED_SIZE, GroupLayout.DEFAULT_SIZE,
GroupLayout.PREFERRED_SIZE) ...
Я думаю, что вы должны использовать 1-й вариант.