原始发表时间:2009-07-21
开发环境:
JDK 1.6.0
Eclilpse 3.3.2
明天号称N百年一次的日全食~~可是XM这边只能看到偏食~~芹菜吧~~今晚还是照例加班,花N个钟头解决一个头疼的焦点问题,有效代码只有一行。
用swing写程序是越来越痛苦了,先是组合框的选项列表不能根据选项文本的长度来自动调节宽度(查阅官方的bug列表,从2002年就有人提出,而且很不幸的是直到今天,这还是一个bug……),后是今天的焦点控制系统跟操作系统隔膜的有来有去。前者不提,本文只说后者是在什么工作场景下遭遇的——
项目中需要根据配置动态生成一个表格和编辑界面,表格中各列的单元格编辑器是动态生成的,有可能是文本框或下拉框,双击某个单元格后,从表格切换到编辑界面。表格中显示大量的人员信息,双击某个单元格,则在编辑页中显示该行数据的具体内容。
因为两个界面中编辑器相同,所以复用它们。
双击表格中人员信息的“姓名”列,进入编辑界面,而后一直按TAB键切换焦点,挨个遍历各个录入框,因为顺序不确定,焦点有可能会在遍历到某个编辑器时,切换到编辑页外的其他组件。参考了Java官方教程里关于焦点子系统的教程,继承实现了自己的焦点转换策略。将所有的编辑器按照预期的顺序串联起来。
但是发现另外一个问题,当焦点切换到“姓名”录入框时,按TAB键会发现焦点又返回到第一个录入框。
起初猜测是整个切换过程是在双击表格中“姓名”列的事件处理逻辑触发的,而处理双击事件的时候,“姓名”列的单元格编辑器仍然具有焦点。这个单元格编辑器与编辑页中的“姓名”录入框共用了同一个文本框对象。但是为什么会影响到焦点切换,仍没有头绪。
后来想到既然是切换焦点时从“姓名”录入框跳回到第一个录入框,那么也就肯定是焦点切换策略中 getComponentAfter(...)
方法无法正确获取下一个组件,而错误地得到第一个组件。于是用老一套方法,在自己实现的代码中 getComponentAfter(...)
方法第一行设置断点,观察调用堆栈中最有可能出现问题的地方,最终聚焦到类 LegacyGlueFocusTraversalPolicy 的方法 Component
getComponentAfter(Container focusCycleRoot, Component aComponent)
上,单步前进发现判断语句
delegatePolicy != null &&
prevHardCoded.isFocusCycleRoot(focusCycleRoot)
无法返回true,也就导致无法正常调用我自己编写的焦点转换策略中的方法 getComponentAfter(...)
但是 delegatePolicy
肯定不为null,也即是说后一个条件返回了false;当焦点放在“姓名”编辑框上是,prevHardCoded正是录入“姓名”的文本框对象,方法
isFocusCycleRoot(...)
正是用来判断组件是否为某个面板的焦点循环系统中的一员。结果很不幸,貌似(请注意这里用了“貌似”,因为我没有找到佐证的代码,所以只能猜测)“姓名”编辑框已经被先作为表格的单元格编辑器对象,所以无法不能算是编辑页面板的焦点循环系统中的一员,这也能解释为什么方法
isFocusCycleRoot(...) 返回false了。
查阅网上一帖子的解决方法是覆写 JTextField 的方法
isFocusCycleRoot(...),始终返回true。不过我很困扰随便覆写这种方法的做法,于是乎尝试了一下在这个录入框初始化的时候,设置属性
focusCycleRoot 为 true,结果竟然可行,表格和编辑页的焦点循环系统都能够正常的在录入框上转移焦点了~~~
分享到:
相关推荐
swing登录框swing登录框swing登录框swing登录框
当用户按下鼠标按钮时,监听器记录下鼠标的位置,然后在鼠标移动时更新面板的位置,使其跟随鼠标移动。释放鼠标按钮后,面板停止移动。 在“选项卡.txt”这个文件名中,我们可以推测可能包含有关如何在浮动面板上...
【QQ面板javaSwing】是Java编程中使用Swing库创建的一个特定类型的用户界面组件,主要目的是实现自动分页的功能。在Swing中,我们通常使用JPanel来构建自定义的用户界面,这个QQ面板就是一个由多个JPanel组成的复合...
Swing 是 Java 用于构建图形用户界面(GUI)的一个库,它是 Java Foundation Classes (JFC) 的一部分。在Java世界中,Swing 提供了一套丰富的组件,用于创建美观且功能强大的桌面应用程序。这个“Swing 实现的界面...
1. **布局管理**:Swing中的布局管理器被用来自动调整组件的位置和大小。在这个例子中,`ToolTipSingle`类的组件使用了`BorderLayout`布局,将窗口分为北、南、东、西、中五个区域,便于组件的定位。 2. **组件**:...
Swing是Java编程语言中的一个图形用户界面(GUI)工具包,它是Java Foundation Classes (JFC)的一部分。在Swing中,弹出框是用于与用户交互的重要组件,它们可以显示警告、确认信息或者请求用户的输入。Swing提供了...
7. **Swing布局管理器**:虽然在这个例子中布局管理不是主要焦点,但理解如何使用BorderLayout、GridLayout或BoxLayout等布局管理器来组织组件是很重要的,以确保复选框树在窗口中正确显示。 8. **数据绑定**:为了...
Java Swing框架是Java标准库中的一个关键部分,用于构建丰富的图形用户界面(GUI)。它提供了大量的组件和工具,使得开发者可以创建出具有专业外观和功能的桌面应用程序。Swing是建立在AWT(Abstract Window Toolkit...
在这个“Java Swing Application框架”中,我们将深入探讨Swing如何帮助开发者构建大型应用程序。 首先,Swing框架的基础是组件(JComponents),它们是构成GUI的基本元素,如按钮(JButton)、文本框(JTextField...
标题中的“swing的两个资料”指的是Java编程领域中关于Swing GUI库的两份学习资源。Swing是Java Standard Edition(Java SE)的一部分,用于构建桌面应用的图形用户界面(GUI)。它提供了一系列组件,如按钮、文本框...
在学生信息录入时,为了确保数据的准确性,系统可能包含数据验证逻辑。例如,检查学号是否唯一,出生日期是否在有效范围内,学号和姓名不能为空等。 7. **文件操作**: 如果使用文件存储,系统需要包含读写文件的...
Swing和Eclipse是Java开发领域中的两个重要概念,它们在构建用户界面方面扮演着不同的角色。本篇文章将深入探讨Swing和Eclipse式的框架源码,帮助开发者更好地理解和运用这些技术。 首先,Swing是Java的一个图形...
在Java的Swing库中,`JTable`是用于创建二维数据展示的组件,它类似于电子表格。在某些场景下,我们可能需要在`JTable`的每一行中添加复选框,以便用户可以选择或取消选择特定行。这通常用于实现多选功能,例如在...
JSplitPane则用于分割窗口,让用户可以调整两个区域的大小。 7. **对话框**:JOptionPane提供了一些预定义的对话框,如消息对话框、确认对话框、输入对话框等,方便快速构建用户交互。 8. **国际化支持**:Swing ...
Java Swing提供了`javax.swing.tree.TreeCellRenderer`接口,我们可以创建一个实现了这个接口的类,比如`javax.swing.JTree.CheckboxTreeCellRenderer`,用于显示带有复选框的节点。 3. **CheckBoxTreeModel**: -...
在Java的Swing库中,开发用户界面时经常会遇到需要创建具有滚动条的多选下拉选择框的需求。这样的组件可以提供丰富的交互性,并且在选项较多时,用户可以通过滚动条方便地浏览和选择。标题提到的"swing带滚动条的...
例如,当复选框被选中时,可以启用某个按钮;反之,如果复选框未被选中,则禁用该按钮。这通常通过添加ItemListener或者ActionListener来实现。 JButton是Swing中的按钮组件,它的状态(是否可用)可以通过...
当用户点击按钮时,检查选中的两个按钮是否符合消除条件,如果符合条件则进行消除操作,并更新游戏板状态。同时,需要考虑消除后相邻方块的翻转,以展示可能的新匹配对。 此外,还要考虑游戏的结束条件,例如所有可...
Swing应用程序框架是Java开发GUI(图形用户界面)应用程序的一种核心工具,由Sun Microsystems(现已被Oracle收购)设计。这个框架提供了丰富的组件、事件处理机制和可定制的外观,使得开发者能够构建功能强大的桌面...
在某些情况下,用户可能会遇到“白屏”问题,这通常是由于Swing组件渲染不正确或者与Java运行时环境(JRE)的兼容性问题导致的。标题提到的“解决swing白屏问题的jjre”可能是一个专门针对这种问题的优化过的JRE版本...