边框布局与网格布局冲突

时间:2016-01-12 00:24:46

标签: java swing layout-manager grid-layout border-layout

我有3个JPanel个组件。面板1设置为BorderLayout.NORTH,面板2设置为BorderLayout.CENTER,面板3设置为BorderLayout.SOUTH

现在,面板1有GridLayout(1,2),面板2也有GridLayout(1,2)。 困扰我的是在面板1和面板2中,组件对齐,好像它们在GridLayout组合在一起。

具体来说,我在面板1中有一组JTextField个组件,位于行= 0和列= 1。

我的JTable位于JScrollPane内,位置为第0行,第{2}位于第2位。

无论我尝试什么,这些组件都以相同的尺寸呈现。

代码太长了,无法在此发布,如果有人能够澄清如何从概念上解决这个问题,我将不胜感激。

public class PanelTest extends JFrame{
    public static void main (String args[]) {
        new PanelTest();
    }
    public PanelTest() {
        this.setPreferredSize(new Dimension(800,200));
        JPanel panel1 = new JPanel();
        panel1.setLayout(new GridLayout(1,2));
        JPanel panel2 = new JPanel();
        panel2.setLayout(new GridLayout(1,2));

        JTextField textField1 = new JTextField();
        textField1.setPreferredSize(new Dimension(500, 100));
        JTextField textField2 = new JTextField();
        textField2.setPreferredSize(new Dimension(300, 100));
        panel1.setMinimumSize(new Dimension(800, 100));

        panel1.add(textField1);
        panel1.add(textField2);

        JTable table = new JTable();
        //... 
        JScrollPane jps1 = new JScrollPane(table);
        jps1.setPreferredSize(new Dimension(200, 300));
        JTextField textField3 = new JTextField(10); 
        JScrollPane jps2 = new JScrollPane(textField3);

        panel2.add(jps1);
        panel2.add(jps2);
        setLayout(new BorderLayout());
        add(panel1, BorderLayout.NORTH);
        add(panel2, BorderLayout.SOUTH);
        this.setVisible(true);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

使用GridBagLayout:

  public PanelTest() {
    this.setPreferredSize(new Dimension(800,200));
    this.setMinimumSize(new Dimension(800,200));
   JPanel panel1 = new JPanel();
    panel1.setLayout(new GridBagLayout());
    JPanel panel2 = new JPanel();
    panel2.setLayout(new GridBagLayout());

    JTextField textField1 = new JTextField();
    textField1.setPreferredSize(new Dimension(500, 100));
    JTextField textField2 = new JTextField();
    textField2.setPreferredSize(new Dimension(300, 100));
    panel1.setMinimumSize(new Dimension(800, 100));

    GridBagConstraints gbc = new GridBagConstraints();
    //      gbc.insets = new Insets(5,100,5,1);
    gbc.gridx=0;
    gbc.gridy=0;
    panel1.add(textField1, gbc);
    gbc.gridx=1;
    panel1.add(textField2, gbc);

    JTable table = new JTable();
    //... 
    JScrollPane jps1 = new JScrollPane(table);
    jps1.setPreferredSize(new Dimension(600, 300));
    jps1.setMinimumSize(new Dimension(600, 300));
    JTextField textField3 = new JTextField(); 

    gbc = new GridBagConstraints();
    //      gbc.insets = new Insets(5,100,5,1);
    gbc.gridx=0;
    gbc.gridy=0;
    panel2.add(jps1, gbc);
    gbc.gridx=1;
    panel2.add(textField3, gbc);
    setLayout(new BorderLayout());
    add(panel1, BorderLayout.NORTH);
    add(panel2, BorderLayout.SOUTH);
    this.setVisible(true);
    this.setVisible(true);
    this.pack();
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

1 个答案:

答案 0 :(得分:1)

  

困扰我的是在面板1和面板2中,组件对齐,就好像它们在GridLayout组合中一样。

来自Java docs

  

GridLayout simply makes a bunch of components equal in size and displays them in the requested number of rows and columns.

“它会以相同的大小显示它们”,所以,如果你有2列并且JFrame的大小是900px,那么你将拥有2个450px的组件,如果你有3个,那么它将是3个组件,每个300px。

这就是为什么你应该avoid the use of setPreferred|maximum|minimum size methods并让布局管理器为你选择尺寸,或者如果你真的需要一个固定的尺寸,你应该覆盖{@ 1}}尺寸,正如@trashgod所说的那样。答案。

您可能希望使用GridBagLayout代替Layout Manager或其他FlowLayout,例如BoxLayoutavoid extending JFrame并将它们合并。

除非非常必要,否则你也应enter image description here

由于你没有发布用户界面的外观,我可以想象你想要这样的东西:

{{3}}

使用以下代码完成:

getPreferred|maximum|minimum