尝试使用Window#pack
使此 Window 调整大小以适合其子组件的首选大小和布局。如果任一尺寸小于先前调用 setMinimumSize 方法指定的最小尺寸,则生成的窗口宽度和高度会自动放大。
如果窗口和/或其所有者还不能显示,则在计算首选大小之前,它们都可以显示。在计算窗口大小后验证窗口。
更新了示例
如果没有SSCCE(工作示例),就不可能完全诊断您的问题。让我演示一下...
因此,根据您的描述,我可以毫无问题地创建它...
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;
public class TestPack {
public static void main(String[] args) {
new TestPack();
}
public TestPack() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new TopPanel(), BorderLayout.NORTH);
frame.add(new MiddlePanel(), BorderLayout.CENTER);
frame.add(new UpdatePanel(), BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TopPanel extends JPanel {
public TopPanel() {
setBackground(Color.red);
add(new JLabel("I'm on top"));
}
}
public class MiddlePanel extends JPanel {
public MiddlePanel() {
setLayout(new BorderLayout());
add(new JScrollPane(new JTable(new DefaultTableModel(new Object[]{"A", "B", "C"}, 5))));
}
}
public class UpdatePanel extends JPanel {
public UpdatePanel() {
for (int index = 0; index < 5; index++) {
add(new JLabel(Integer.toString(index)));
add(new JTextField(5));
}
add(new JButton("Button"));
}
}
}
但显然,你正在做一些不同的事情。花时间用一个工作示例更新您的问题,否则我们无能为力