引言
很多时候,我们需要在界面初始化以后对程序进行某些设置,举个例子,当界面呈现出来以后,设置下SplitPane的的百分比(关于这个为什么必须这么处理请参考java源代码)。很容易我们就想到给程序添加ComponentListener监听,然后在监听中作处理,如下所示:
panel.addComponentListener(new ComponentAdapter() {
public void componentShown(ComponentEvent e) {
System.out.println("panel:shown");
}
});
但是并没有和我们想象的那样,当组件在界面上显示出来的时候fire出componentShown类型的事件的,下面我们通过研究源代码分析下原因。
原因分析
首先的问题是在什么地方会fire出ComponentEvent,通过查看源代码,我们可以看到实在Component的show()方法中:
ComponentEvent e = new ComponentEvent(this,ComponentEvent.COMPONENT_SHOWN);
Toolkit.getEventQueue().postEvent(e);具体代码,请参考java源程序。
也就是说只有在组件调用到setVisible(true)的时候才会fire出ComponentEvent,但是你会发现,即便是我们调用JComponent的setVisible(true),也不会监听到shown事件。原因主要是JComponent重载了setVisible方法