Swing布局管理器:在填充整个水平空间时保持统一按钮大小

时间:2012-07-16 18:19:19

标签: java swing layout

我正在尝试构建以下可调整大小的JPanel:

+-----------------------+
|                       |
|                       |
|                       |
|                       |
|                       |
|     JScrollPane       |
|     (containing a     |
|        JTable)        |
|                       |
|                       |
|                       |
|                       |
|                       |
+-----------+-----------+
|  button1  |    b2     |
+-----------+-----------+

我希望button1和b2始终具有相同的宽度,这意味着当整个组件水平调整大小时,两个按钮都应该获得或失去相同的宽度。按钮本身之间以及按钮和面板边框之间不应有空格。也就是说,按钮应始终占用所有可用的水平空间。请注意,按钮上的文字长度不同。

当组件垂直调整大小时,我希望JScrollPane获得新的高度,而带按钮的行应始终保持相同的高度(基本上是button1.getPreferedSize().getHeight())。

我尝试过一大堆不同的LayoutManagers。我得到的最接近的是将两个按钮放在一个新的JPanel中,并将该面板的LayoutManger设置为new GridLayout(0,2)。这至少保持了两个按钮的均匀宽度,并填满了所有水平空间。但是,当面板垂直调整大小时,它们仍会改变高度。

使用其他LayoutManagers(例如GroupLayout),我可以通过链接按钮(groupLayout.linkSize(button1, b2))来保持相同的宽度,但无法让它们填充整个水平空间。

实现这一目标的最佳方法是什么?应该使用什么是LayoutManager?

1 个答案:

答案 0 :(得分:3)

我强烈建议您查看MigLayout。它是一个非常灵活且易于使用的布局管理器。

如果您不想使用它,我建议使用BorderLayout创建一个JPanel,并将scrollpane放在borderlayout的中心。然后,使用GridLayout创建另一个JPAnel,其中包含1行和2列,并将两个按钮添加到该行。然后,使用borderlayout将该面板添加到JPanel的南部区域。

代码看起来像这样:

    JPanel mainPanel = new JPanel();
    mainPanel.setLayout(new BorderLayout());

    JPanel tablePanel = new JPanel();
    JScrollPane jsp = new JScrollPane(new JTable());
    tablePanel.add(jsp);
    mainPanel.add(jsp, BorderLayout.CENTER);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setLayout(new GridLayout(1, 2));
    JButton button1 = new JButton("Button 1");
    JButton button2 = new JButton("Button 2");
    buttonPanel.add(button1);
    buttonPanel.add(button2);
    mainPanel.add(buttonPanel, BorderLayout.SOUTH);

    this.add(mainPanel);