Java 在JFrame内自动调整JPanel的大小

Java 在JFrame内自动调整JPanel的大小,java,swing,size,jframe,jpanel,Java,Swing,Size,Jframe,Jpanel,我有一个JPanel子类,我在上面添加了按钮、标签、表格等。为了在屏幕上显示它,我使用JFrame: MainPanel mainPanel = new MainPanel(); //JPanel subclass JFrame mainFrame = new JFrame(); mainFrame.setTitle("main window title"); mainFrame.getContentPane().add(mainPanel); mainFrame.setLocation(10

我有一个
JPanel
子类,我在上面添加了按钮、标签、表格等。为了在屏幕上显示它,我使用
JFrame

MainPanel mainPanel = new MainPanel(); //JPanel subclass

JFrame mainFrame = new JFrame();
mainFrame.setTitle("main window title");
mainFrame.getContentPane().add(mainPanel);
mainFrame.setLocation(100, 100);
mainFrame.pack();
mainFrame.setVisible(true);
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

但当我调整窗口的大小时,面板的大小不会改变。如何使面板的大小与窗口的大小相同,即使它已调整大小?

您需要为JFrame设置一个要使用的布局管理器-这涉及组件的定位方式。一个有用的工具是BorderLayout管理器

只需添加以下代码行即可解决问题:

mainFrame.setLayout(new BorderLayout());

(在将组件添加到JFrame之前执行此操作)

您可以设置类似BorderLayout的布局管理器,然后更具体地定义面板的位置:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new BorderLayout());
mainFrame.add(mainPanel, BorderLayout.CENTER);
mainFrame.pack();
mainFrame.setVisible(true);

这会将面板置于框架的中心区域,并使其在调整框架大小时自动增长。

如果我们的朋友提供的BorderLayout选项不起作用,请尝试将ComponentListerner添加到JFrame并实现ComponentResisted(event)方法。调整JFrame对象的大小时,将调用此方法。因此,如果您在这个方法中编写代码来设置JPanel的大小,您将获得预期的结果

是的,我知道这个“解决方案”不好,但把它当作一个安全网。
;)

正如其他海报所说,您需要更改正在使用的LayoutManager。我总是喜欢使用GridLayout,这样您的代码就会变成:

MainPanel mainPanel = new MainPanel();
JFrame mainFrame = new JFrame();
mainFrame.setLayout(new GridLayout());
mainFrame.pack();
mainFrame.setVisible(true);

当您希望您的面板占据整个屏幕时,GridLayout在概念上对我来说似乎更为正确。

根据我的经验,我使用了GridLayout

    thePanel.setLayout(new GridLayout(a,b,c,d));
a=行数,b=列数,c=水平间隙,d=垂直间隙


例如,如果我想使用以下内容创建面板:

  • 无限行(设置a=0)
  • 1列(设置b=1)
  • 垂直间隙=3(设置d=3)
代码如下:

    thePanel.setLayout(new GridLayout(0,1,0,3));

当您希望将JScrollPane添加到JPanel时,此方法非常有用。当您在JScrollPane中添加一些组件时,JPanel inside JScrollPane的大小将自动更改,因此JScrollPane将自动重置滚动条。

进一步阅读。在这种情况下,重要的是JFrame的默认布局管理器是FlowLayout。BorderLayout.CENTER呢?我认为它主要用于此类情况。我的swing库中没有mainPanel clas!为什么?主面板由Igor编写;它是JPanel的一个子类,目前处于Swing中。当被迫在JLayeredPane中使用空布局时,这是一个很好的解决方案,谢谢!)