如何在Borderlayout的.CENTER中创建组件占用所有中心空间并使用应用程序resize?

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

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

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

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

布局比较图像

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