根据我的要求:
(*)位置:我的意思是Component.setLocation(x, y)中的位置。
有一个明显的解决方案,如果这是GridBagLayout,该怎么做?
详细说明:
我想通过仅指定垂直位置将组件垂直放入列容器(如垂直框)中。在不失去BoxLayout等布局的其他好处的情况下,最好的方法是什么?
在垂直方框中,必须使用filler设置组件的垂直位置,或者通过调整上方组件的大小,不存在这样的可能性:
panel.setLocation(getLocation().x, y)
另一方面,使用no layout容器让我完成任务管理:
此处建议使用null layout的解决方案,此处为custom,此处为GridBagLaout。此外,MIGLayout似乎是通用的(但我不希望在我的项目中添加另一个库)。
答案 0 :(得分:2)
我为那些也在寻找相同要求的人编写了以下程序。
注意:确保将第一个元素添加到0位置,因为没有更多的组件,除了0,第2到0或1,第3到0或1或2之外没有其他位置可用在
public class VerticalList extends JFrame {
JPanel pnl = null;
TextField tf = new TextField(10);
Box center = Box.createVerticalBox();
JScrollPane jsp = new JScrollPane(center);
JPanel ctrl = new JPanel(new FlowLayout());
JButton send = new JButton("Send");
public VerticalList() {
jsp.setAutoscrolls(true);
ctrl.add(send);
ctrl.add(new JLabel("Position:"));
ctrl.add(tf);
Container cnt = getContentPane();
cnt.add(jsp, BorderLayout.CENTER);
cnt.add(ctrl, BorderLayout.SOUTH);
send.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
pnl = new JPanel(new FlowLayout());
pnl.setBorder(BorderFactory.createLineBorder(Color.red));
pnl.add(new JLabel("Added to Position: "+tf.getText()));
pnl.setMaximumSize(new Dimension(Integer.MAX_VALUE, (int)pnl.getPreferredSize().getHeight()));
try{
int index = Integer.parseInt(tf.getText());
center.add(pnl, index);
}catch(Exception ex){
JOptionPane.showMessageDialog(null, "Please Provide a Valid position", "Position Error", JOptionPane.ERROR_MESSAGE);
}
validate();
}
});
setPreferredSize(new Dimension(300, 300));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
pack();
}
public static void main(String[] args) {
new VerticalList();
}
}