有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

swing java的布局

我想创建一个这样的布局

i want like this

这是我的代码(不工作):

outer.setLayout(new BorderLayout());

panel1 = new JPanel();
...
outer.add(panel1, BorderLayout.PAGE_START);
outer.add(panel2, BorderLayout.LINE_START); 
outer.add(panel3, BorderLayout.CENTER); 
outer.add(panel4, BorderLayout.LINE_END); 
outer.add(panel5, BorderLayout.PAGE_END);  

注:上面的面板5应包含2个以上的面板

在上面的代码中,我可以将它们放在正确的位置,但是中间的一个(面板3)非常大,所以所有其他的都被挤压到一边

我怎样才能得到这些尺寸的一些比例,如2:10:2等

我应该改变我的布局吗


共 (2) 个答案

  1. # 1 楼答案

    GridBagLayout用于类似于表/矩阵的布局,其中一些“单元”占用多个插槽。 BorderLayout用于一个中央面板,周围有一些边框面板

    public MainFrame() {
        JPanel outer = new JPanel(new GridBagLayout());
        outer.setPreferredSize(new Dimension(800, 600));
    
        JPanel panel1 = createPanel("1");
        JPanel panel2 = createPanel("2");
        JPanel panel3 = createPanel("3");
        JPanel panel4 = createPanel("4");
        JPanel panel5 = createPanel("5");
    
        GridBagConstraints c = new GridBagConstraints();
        c.fill = GridBagConstraints.BOTH;
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.gridx = 0;
        c.gridy = 0;
        c.gridwidth = 3; // col span
        c.gridheight = 1;
        outer.add(panel1, c);
    
        c.weightx = 0.33;
        c.gridx = 0;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        outer.add(panel2, c);
    
        c.weightx = 0.33;
        c.gridx = 1;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        outer.add(panel2, c);
    
        c.weightx = 0.33;
        c.gridx = 2;
        c.gridy = 1;
        c.gridwidth = 1;
        c.gridheight = 1;
        outer.add(panel3, c);
    
        c.weightx = 0.33;
        c.gridx = 3;
        c.gridy = 1;
        c.gridwidth = 3;
        c.gridheight = 1;
        outer.add(panel4, c);
    
        c.weightx = 1.0;
        c.weighty = 1.0;
        c.gridx = 0;
        c.gridy = 2;
        c.gridwidth = 3;
        c.gridheight = 1;
        outer.add(panel5, c);
    
        setContentPane(outer);
        pack();
    }
    
    private JPanel createPanel(String title) {
        JPanel panel = new JPanel();
        panel.setBorder(BorderFactory.createTitledBorder(title));
        setPreferredSize(new Dimension(300, 300));
        return panel;
    }
    

    有一个GridBagConstraints构造函数设置所有字段。然而,这里的可读性不太好

    它也是一个非常容易出错的布局

  2. # 2 楼答案

    如果您想做类似的事情,使用BorderLayout是一个好的开始。所以,是的,我在这里也会使用BorderLayout

    但是,您应该更改添加面板的方式:

    outer.add(panel1, BorderLayout.NORTH);
    outer.add(panel2, BorderLayout.WEST);
    outer.add(panel3, BorderLayout.CENTER);
    outer.add(panel4, BorderLayout.EAST);
    //Create a additional Panel for the two at the bottom
    JPanel southPanelContainer = new JPanel(new BorderLayout());
    southPanelContainer.add(panel5, BorderLayout.EAST);
    southPanelContainer.add(panel6, BorderLayout.WEST);
    outer.add(southPanelContainer, BorderLayout.SOUTH);
    

    这看起来应该已经有点像样了,但是如果您仍然想改变它的外观,那么您应该向这些面板添加一些组件。布局管理器将自动调整面板大小,使所有内容都适合