我不太确定我是否理解您的问题,TreeSelectionListener
以及它与stopCellEditing()
被调用的计时方法的关系。您在创建自定义TreeCellEditor
吗?如果是这样,有关此编辑器设置的更多信息将很有用。
但是,您还引用了与 a 上的单元格编辑有关的较早项目JTable
,它失去了对外部组件的焦点,以及这对编辑单元格的影响。我认为这是一个暗示,你想要一个类似的解决方案JTree
......
如前所述,JTree
不实现"terminateEditOnFocusLost"
开箱即用的属性处理。这并不意味着你可以自己做。
查看 的代码JTable
,它非常简单。一个类被放在一起,其唯一的工作是确定当JTree
焦点发生变化时是否仍然有焦点,如果没有,它调用stopEditing()
,如果失败,它调用cancelEditing()
。这是,适用于一棵树:
class CellEditorRemover implements PropertyChangeListener {
KeyboardFocusManager focusManager;
public CellEditorRemover(KeyboardFocusManager fm) {
this.focusManager = fm;
}
public void propertyChange(PropertyChangeEvent ev) {
if (!tree.isEditing() ||
tree.getClientProperty("terminateEditOnFocusLost") != Boolean.TRUE)
{
return;
}
Component c = focusManager.getPermanentFocusOwner();
while (c != null) {
if (c == tree) { // focus remains inside the tree
return;
} else if ((c instanceof Window)
|| (c instanceof Applet && c.getParent() == null))
{
if (c == SwingUtilities.getRoot(tree)) {
if (!tree.getCellEditor().stopCellEditing()) {
tree.getCellEditor().cancelCellEditing();
}
}
break;
}
c = c.getParent();
}
}
}
你会注意到你的树必须能被这个类以某种方式访问。要完成这项工作,需要执行几个设置调用:
tree.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
KeyboardFocusManager fm =
KeyboardFocusManager.getCurrentKeyboardFocusManager();
editorRemover = new CellEditorRemover(fm);
fm.addPropertyChangeListener("permanentFocusOwner", editorRemover);
这应该有一个额外的好处,就是让你的JTree
行为方式与JTable
你按下 a 时的行为方式相同JButton
。