为JTree
设置了设备编辑器时,单元格编辑停止后调用方法getCellEditorValue
的时间/位置是什么?我需要修改调用此方法的行为,以允许编辑器更新多个节点,而不仅仅是单个节点。
有人可以提供一个替代此行为的示例吗?
DeviceEditor deviceEditor = new DeviceEditor(nodes);
itemTree.setCellEditor(deviceEditor);
deviceEditor.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
System.out.println("ACTION COMMAND= " + ae.getActionCommand());
if ("Update".equals(ae.getActionCommand())) {
//get the Device From the editor.
//update all the nodes' userObjects to the values of the editor except the ones with <Multiple Values>
//stopEditing expects an Object from DeviceEditor. We need a way to stopEditing without providing an object.
itemTree.stopEditing(); //update the nodes
}
if ("Cancel".equals(ae.getActionCommand())) {
itemTree.cancelEditing();
}
}
});
答案 0 :(得分:0)
JTree#stopEditing
调用组件的UI委托的(TreeUI
)stopEditing
方法BasicTreeUI#stopCellEditing
(这是一个不错的起点)调用TreeCellEditor
的{{1}}方法stopCellEditing
(这是一个不错的起点)称其为编辑者委托的()DefaultTreeCellEditor#stopCellEditing
stopCellEditing
(这是DefaultCellEditor#stopEditing
使用的TreeCellEditor
的默认实例,是一个很好的起点)向注册的DefaultCellEditor
触发editingStopped
事件听众CellEditorListener
,它使用BasicTreeUI
类来处理事件,该事件通过一系列希望被称为private
因此,您的问题的答案是“很复杂”,并且不能保证每个TreeModel#valueForPathChanged
实例都相同(因为UI委托可以更改操作路径)。
主要收获是这个。您可以采用两种可能的解决方案...
JTree
中添加一个CellEditorListener
。这很容易出错,因为您可能正在与TreeCellEditor
进行斗争,并且模型的状态将无法确定JTree
应该使用的方式。它已经提供了TreeModel
,可为您提供确定哪个单元格被修改以及要应用于该单元格的新值所需的所有信息。该模型还应该生成适当的更改事件,并且可以独立于vaueForPathChanged
调用此方法,从而使其成为一个完美的选择