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

时间:2009-09-16 15:07:51

标签: java swing

为什么这段代码永远不会打印“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 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

AWT对“可见”的定义可能有点违反直觉。来自java.awt.Component的#avavoc#isVisible:

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

根据此说明,未调用p is already visible before you add the ComponentListener. In fact, you can verify this if you insert a

is already visible before you add the ComponentListener. In fact, you can verify this if you insert a

System.out.println(p.getVisible());

答案 2 :(得分:0)

来自Java Tutorials

  

组件隐藏和   组件显示的事件仅作为   调用Component的结果   setVisible方法。例如,a   窗口可能会小型化为   图标(图标化)没有   被触发的组件隐藏事件。