主ComponentListener
有一个JFrame
,它会在调整大小时发送一个事件,但是当事件被触发时,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) {}
}
如何在JPanel setSize
调整大小期间控制JFrame
?
修改:我了解BorderLayout
设置组件以填充边框。它如何设置组件的大小?是在呼叫setSize
吗?如果是,为什么被覆盖的setSize被调用?
答案 0 :(得分:1)
是否正在调用setSize?
布局管理器使用getPreferredSize(),getMinimumSize()和getMaximum()大小作为提示。布局管理器并使用或忽略这些提示。将组件添加到BorderLayout的CENTER时,将忽略所有提示,并将组件的大小调整为可用空间。所以,是的,布局管理器将调用组件的setSize()(和setLocation)方法。你不应该直接调用setSize()方法
为什么我的被覆盖的setSize不被调用?
你没有override
setSize()方法。当您执行代码时,invoked
setSize()方法。然后,当frame为packed()并且布局管理器将调用面板上的setSize()方法时,将调用布局管理器。
答案 1 :(得分:1)
在LayoutManager的控件下添加到容器时,无法直接控制组件大小。这违背了使用布局管理器的目的。
如果您希望在组件大小发生变化时通知,请将ComponentListener添加到组件(而不是容器)。
答案 2 :(得分:0)
如果BorderLayout的约束是BorderLayout.CENTER,则无法调整其大小。 该组件自动获取所有可用空间。
更多信息:http://docs.oracle.com/javase/tutorial/uiswing/layout/border.html