JTree编辑器-在哪里调用getCellEditorValue()?

时间:2018-10-10 18:45:23

标签: java swing jtree

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();
        }
    }
});

1 个答案:

答案 0 :(得分:0)

  • JTree#stopEditing调用组件的UI委托的(TreeUIstopEditing方法
  • BasicTreeUI#stopCellEditing(这是一个不错的起点)调用TreeCellEditor的{​​{1}}方法
  • stopCellEditing(这是一个不错的起点)称其为编辑者委托的()DefaultTreeCellEditor#stopCellEditing
  • stopCellEditing(这是DefaultCellEditor#stopEditing使用的TreeCellEditor的默认实例,是一个很好的起点)向注册的DefaultCellEditor触发editingStopped事件听众
  • 这使我们回到CellEditorListener,它使用BasicTreeUI类来处理事件,该事件通过一系列希望被称为private

因此,您的问题的答案是“很复杂”,并且不能保证每个TreeModel#valueForPathChanged实例都相同(因为UI委托可以更改操作路径)。

主要收获是这个。您可以采用两种可能的解决方案...

  1. 向树的每个JTree中添加一个CellEditorListener。这很容易出错,因为您可能正在与TreeCellEditor进行斗争,并且模型的状态将无法确定
  2. 使用JTree应该使用的方式。它已经提供了TreeModel,可为您提供确定哪个单元格被修改以及要应用于该单元格的新值所需的所有信息。该模型还应该生成适当的更改事件,并且可以独立于vaueForPathChanged调用此方法,从而使其成为一个完美的选择