如何在Borderlayout的.CENTER中创建一个组件占用所有中心空间并使用应用程序调整大小?

时间:2011-04-28 17:42:10

标签: java jtable jpanel jscrollpane jtabbedpane

我的app / JFrame,使用Borderlayout,顶部或北部有一个工具栏,底部或南部有一个状态栏,中间有一个JPanel.JTabbedPane.JScrollPane.JTable。 JPanel总是一个固定的大小,可以使用各种组合应用的各种set * Size()方法进行粗略调整。但它始终是一个固定的大小,并始终有东西差距。北部和南部组件保持固定高度,并按照预期水平调整大小。

当然,这不是一种新的或独特的设计。

这是正常行为吗? 我错过了一些技巧吗?

1 个答案:

答案 0 :(得分:3)

这是保留FlowLayout的默认JPanel并将面板添加到BorderLayout的中心的特征。以下示例对具有FlowLayout,默认或GridLayout的面板进行了比较。相比之下,这两个被添加到GridLayout,这允许以类似于BorderLayout中心的方式进行扩展。

layout comparison image

import java.awt.EventQueue;
import java.awt.GridLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTree;

/** @see http://stackoverflow.com/questions/5822810 */
public class LayoutPanel extends JPanel {

    public LayoutPanel(boolean useGrid) {
        if (useGrid) {
            this.setLayout(new GridLayout());
        } // else default FlowLayout
        this.add(new JTree());
    }

    private static void display() {
        JFrame f = new JFrame("LayoutPanels");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new GridLayout(1, 0));
        f.add(new LayoutPanel(false));
        f.add(new LayoutPanel(true));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}