问题 自动调整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);

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


11839
2017-12-28 13:17


起源



答案:


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

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

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


13
2017-12-28 15:10



dint为我工作 - Vasanth Nag K V
我的秋千图书馆里没有mainPanel clas!为什么? - Vasanth Nag K V
MainPanel由Igor撰写;它是JPanel的子类,在Swing中。 - GKFX


答案:


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

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

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


13
2017-12-28 15:10



dint为我工作 - Vasanth Nag K V
我的秋千图书馆里没有mainPanel clas!为什么? - Vasanth Nag K V
MainPanel由Igor撰写;它是JPanel的子类,在Swing中。 - GKFX


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

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

mainFrame.setLayout(new BorderLayout());

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


1
2017-12-28 14:18



进一步阅读<java.sun.com/docs/books/tutorial/uiswing/layout/using.html>;。在这种情况下,重要的是JFrame的默认布局管理器是FlowLayout。 - Josh Lee


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

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


1
2018-01-03 10:04



当强制使用JLayeredPane的null布局时,这是一个很好的解决方案,谢谢! :) - Luke


根据我的经验,我使用了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将自动重置滚动条。


1
2017-07-24 06:27





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

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

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


0
2018-01-07 10:48



那么BorderLayout.CENTER呢。我认为它主要用于这类案件。 - PraveenMax