自动调整JFrame中的JPanel大小

我有一个JPanel子类,我在其上添加buutons,标签,表格等。要在屏幕上显示它我使用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); 

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

你可以设置一个像BorderLayout这样的布局管理器,然后更具体地定义你的面板应该去的地方:

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

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

您需要为要使用的JFrame设置布局管理器 – 这将处理组件的定位方式。 一个有用的是BorderLayout经理。

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

 mainFrame.setLayout(new BorderLayout()); 

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

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

雅,我知道这个’解决方案’并不好,但可以用它作为安全网。 ;)

根据我的经验,我使用了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的大小将自动更改,因此JScrollPane将自动重置滚动条。

正如其他海报所说,您需要更改正在使用的LayoutManager。 我总是喜欢使用GridLayout,因此您的代码将成为:

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

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