垂直JPanel手动定位:哪种布局?

时间:2014-09-28 09:41:57

标签: java swing layout

根据我的要求:

  • JPanels的单一垂直列。
  • 设置JPanel的垂直位置*,而不使用兄弟的属性。
  • 调整框架大小时,组件位置和大小是固定的。
  • 尽可能自动保持其他布局方面(例如首选尺寸计算)

(*)位置:我的意思是Component.setLocation(x, y)中的位置。

有一个明显的解决方案,如果这是GridBagLayout,该怎么做?

详细说明:

我想通过仅指定垂直位置将组件垂直放入列容器(如垂直框)中。在不失去BoxLayout等布局的其他好处的情况下,最好的方法是什么?

在垂直方框中,必须使用filler设置组件的垂直位置,或者通过调整上方组件的大小,不存在这样的可能性:

panel.setLocation(getLocation().x, y)

另一方面,使用no layout容器让我完成任务管理:

  • 组件的初始大小
  • 容器调整大小事件。

此处建议使用null layout的解决方案,此处为custom,此处为GridBagLaout。此外,MIGLayout似乎是通用的(但我不希望在我的项目中添加另一个库)。

1 个答案:

答案 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();
    }
}