Java 使用BorderLayout时如何控制JPanel设置大小
我有一个主Java 使用BorderLayout时如何控制JPanel设置大小,java,swing,Java,Swing,我有一个主JFrame的ComponentListener,它在调整大小时发送一个事件,但在触发事件时,Jpanel已经调整大小 public class Test implements ComponentListener { private JFrame frame; private JPanel panel; public Test() { frame = new JFrame(); panel = new JPanel();
JFrame
的ComponentListener
,它在调整大小时发送一个事件,但在触发事件时,Jpanel
已经调整大小
public class Test implements ComponentListener {
private JFrame frame;
private JPanel panel;
public Test() {
frame = new JFrame();
panel = new JPanel();
frame.setPreferredSize(new Dimension(300, 300));
frame.getContentPane().add(panel, BorderLayout.CENTER);
frame.addComponentListener(this);
frame.pack();
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
Test test = new Test();
test.frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
@Override
public void componentResized(ComponentEvent e) {
System.out.println(frame.getSize() + " : " + panel.getSize());
frame.revalidate();
}
@Override
public void componentHidden(ComponentEvent e) {}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) {}
}
如何在JFrame
调整大小期间控制JPanel setSize
编辑:我了解
BorderLayout
设置填充边框的组件。它如何设置组件的大小?它正在调用setSize
?如果是,为什么被替代的setSize调用?如果BorderLayout中的约束为BorderLayout.CENTER,则无法调整该组件的大小。
该组件将自动占用所有可用空间
更多信息:
是不是在叫setSize
布局管理器使用getPreferredSize()、getMinimumSize()和getMaximum()大小作为提示。打开布局管理器并使用或忽略这些提示。将构件添加到BorderLayout的中心时,将忽略所有提示,并根据可用空间调整构件的大小。因此,是的,布局管理器将调用组件的setSize()和setLocation方法。不应直接调用setSize()方法
为什么不调用我的重写setSize
您没有
重写
setSize()方法。执行代码时,调用了
setSize()方法。然后,当框架打包时,将调用布局管理器(),布局管理器将调用面板上的setSize()方法。将组件添加到LayoutManager控制下的容器中时,无法直接控制组件大小。这违背了使用布局管理器的目的
如果您希望在组件大小更改时收到通知,请向组件(而不是容器)添加一个ComponentListener。我将ComponentListener从JFrame更改为JPanel,这证明更符合我的预期。@Aboutblank关于为什么不调用覆盖的setSize()的问题,LayoutManager更可能调用setBounds()-方法,因为它不仅控制大小,还控制位置。但是没有说明LayoutManager必须使用哪种方法,因此它可以使用它认为最适合其工作的任何组件方法。感谢您提供的信息,这正是我想要了解的。