监听JComponent显示事件
来源:互联网 发布:乳胶沙发品牌知乎 编辑:程序博客网 时间:2024/05/22 14:24
很多时候,我们需要在界面初始化以后对程序进行某些设置,举个例子,当界面呈现出来以后,设置下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方法 如下 public void setVisible(boolean aFlag) { if(aFlag != isVisible()) { super.setVisible(aFlag); Container parent = getParent(); if(parent != null) { Rectangle r = getBounds(); parent.repaint(r.x,r.y,r.width,r.height); } // Some (all should) LayoutManagers do not consider components // that are not visible. As such we need to revalidate when the // visible bit changes. revalidate(); } } 因为JComponent的visible属性默认就是true,所以不会调用到Component的setVisible方法,所以也不会fire出ComponentEvent,当然,如果你调用下JComponent的setVisible(false)+setVisible(true)是会fire出ComponentEvent.COMPONENT_SHOWN事件的,(但是在里面很可能得不到当前组件的大小信息或者不能SplitPane设置分割比例,因为这个时候界面还没有初始化),而且如果是JFrame,JDialog,JApplet等也是没问题的,因为他们调用的都是Component的setVisible方法(所以给这些顶层组件添加ComponentListener是没有问题的,都会监听到) 如果不想使用上述方法,还有另外一种方式就是添加HierarchyListener监听,因为当顶层组件(JFrame,JDialog等)setVisible(true)界面显示的时候,里面都会fire出HierarchyEvent.而createHierarchyEvents方法会在每个组件上fire出HierarchyEvent,至于具体细节,有时间的可以dubug下. 测试代码如下
- 监听JComponent显示事件
- JComponent - 组件显示消息
- Swing显示图片 重写Jcomponent
- JComponent
- 监听webview显示完毕事件
- 监听iPad键盘显示和隐藏事件
- Android 键盘显示/隐藏监听事件
- 软键盘显示隐藏事件监听
- android:监听软件盘“返回”键显示隐藏事件
- EditText的监听事件与键盘显示隐藏
- Android如何监听系统输入法弹出显示事件
- 安卓监听软键盘显示和隐藏事件
- 如何监听显示安卓软键盘事件
- JS实现监听事件,添加删除显示控件
- Android如何监听:软键盘显示时:返回键事件
- android监听虚拟键盘隐藏和显示事件
- Android如何监听:软键盘显示时:返回键事件
- Android监听系统输入法键盘弹出显示与隐藏事件
- Ubuntu 10.04 下编译交叉编译环境,编译RTEMS,测试HelloWorld程序
- autoconf/automake 生成 makefile
- Posix线程编程指南(4)
- ASP.net中用C#开发搜索引擎蜘蛛程
- 内存映射文件
- 监听JComponent显示事件
- LaTeX Example
- sqlite字符串拼接
- 二级指针与二级数组汇总
- web.xml加入taglib报错
- VC 图像控件 图像显示
- repaint window caption
- 我配置的ant,build.xml文件用于导入到EJB
- 【动态规划】最大连续序列和最大子矩阵