为什么/何时会调用ComponentListener.componentShown()方法?

4
为什么这段代码从未打印出“Hello2”?
public class Test4 {

    public static void main(String[] args) {
        JFrame f = new JFrame();
        JPanel p = new JPanel();
        f.getContentPane().add(p);

        JLabel x = new JLabel("Hello");
        p.add(x);

        p.addComponentListener(new ComponentListener() {

            public void componentResized(ComponentEvent arg0) {
                 System.err.println("Hello1");
            }

            public void componentMoved(ComponentEvent arg0) {
            }

            public void componentShown(ComponentEvent arg0) {
                System.err.println("Hello2");
            }

            public void componentHidden(ComponentEvent arg0) {
            }
        });

        f.setVisible(true);
        f.pack();
    }
}
3个回答

3

AWT对“可见性”的定义可能有点违反直觉。根据java.awt.Component#isVisible的Javadoc:

"Components are initially visible, with the exception of top level components such as
 Frame objects."

根据这段描述,p在添加ComponentListener之前已经可见。实际上,如果您插入一个,可以验证这一点。
System.out.println(p.getVisible());

在调用f.setVisible(true)之前的任何地方,都可以设置可见性。从这个意义上讲,在显示框架时,可见性不会改变,因此不会调用componentShown(..)。


3
我猜测它在实际对象的可见性状态发生变化时被调用。 在这种情况下,您更改的是框架的可见性,而不是面板的可见性。 (默认情况下,框架是隐藏的,但面板是可见的) 尝试将监听器添加到框架中。

0

来自Java教程

组件隐藏和组件显示事件仅在调用组件的setVisible方法时发生。例如,窗口可能会被缩小成图标(最小化),而不会触发组件隐藏事件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接