Большинство менеджеров компоновки имеют конструкторы без аргументов (то есть вы можете создать FlowLayout с new FlowLayout ()
, GridLayout с new GridLayout ()
, GridBagLayout с новым GridBagLayout()
и т. д.).Однако BoxLayout
требует, чтобы вы передали как контейнер, которым он будет управлять, так и ось, вдоль которой должны располагаться компоненты.
У меня такой вопрос: поскольку вы уже говорите менеджеру компоновки, какой компонент размещать, почему вам нужно писать
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);
вместо первой строки?
Я быстро просмотрел исходный код BoxLayout
и увидел, что используемый мной конструктор (строки 178-185) не вызывает target. setLayout(this)
или что-то в этом роде. Кажется, было бы очень просто просто добавить это. Есть ли причина, по которой он не включен в библиотеку Swing?
Если это имеет значение, я использую
java версии 1.7.0
Java(TM) SE Runtime Environment (сборка 1.7.0-b147)
на Win7Pro.
Спасибо!
SSCCE:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JButton;
public class BoxLayoutSSCCE extends JFrame {
// Change this to see what I mean
public static final boolean CALL_SET_LAYOUT = true;
public BoxLayoutSSCCE () {
super("Box Layout SSCCE");
JPanel panel = new JPanel();
BoxLayout bl = new BoxLayout(panel, BoxLayout.Y_AXIS);
if (CALL_SET_LAYOUT) {
panel.setLayout(bl);
}
panel.add(new JButton("Button 1"));
panel.add(new JButton("Button 2"));
}
public static void main (String[] args) {
BoxLayoutSSCCE blsscce = new BoxLayoutSSCCE();
blsscce.pack();
blsscce.setVisible(true);
}
}