Большинство менеджеров компоновки имеют конструкторы без аргументов (то есть вы можете создать FlowLayout с new FlowLayout()
, GridLayout с new GridLayout()
, GridBagLayout с new GridBagLayout()
и т. Д.). Однако BoxLayout
требует, чтобы вы передали как контейнер, который он будет управлять, так и ось, по которой должны быть выложены компоненты.Зачем вам нужно вызывать setLayout с BoxLayout?
Мой вопрос: так как вы уже говорит менеджер компоновки, который компонент выложить, почему вам нужно написать
BoxLayout bl = new BoxLayout(myPanel, BoxLayout.Y_AXIS);
myPanel.setLayout(bl);
, а не только в первой строке?
Я быстро посмотрел на the BoxLayout
source code и увидел, что используемый мной конструктор (строки 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);
}
}
+1 для [sscce] (http://sscce.org/) – trashgod