JTree Editor - Где вызывается getCellEditorValue ()? - PullRequest
0 голосов
/ 10 октября 2018

Когда для редактора устройства установлено значение 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 голосов
/ 10 октября 2018
  • JTree#stopEditing вызывает метод делегата пользовательского интерфейса компонента (TreeUI) stopEditing, метод
  • BasicTreeUI#stopCellEditing (это хорошее место для начала), вызывает TreeCellEditor stopCellEditing method
  • DefaultTreeCellEditor#stopCellEditing (это хорошее место для начала) вызывает своего делегата редактора (?) stopCellEditing
  • DefaultCellEditor#stopEditing (который является используемым по умолчанию экземпляром TreeCellEditorна DefaultCellEditor и хорошее место для начала) запускает событие editingStopped для зарегистрированных CellEditorListener слушателей
  • , что возвращает нас к BasicTreeUI, который использует класс private для обработки событиякоторый через серию надежд вызывает TreeModel#valueForPathChanged

Итак, ответ на ваш вопрос «это сложно» и не гарантируется, что он будет одинаковым для каждого экземпляра JTree (так какДелегат пользовательского интерфейса может изменить путь операций).

Основной вывод заключается в следующем.Вы можете сделать два возможных решения ...

  1. Добавить CellEditorListener к каждому TreeCellEditor дерева.Это подвержено ошибкам, так как вы, вероятно, будете бороться с JTree, а состояние модели будет неопределенным
  2. Используйте TreeModel так, как это предполагается использовать.Он уже предоставляет vaueForPathChanged, который предоставляет вам всю информацию, необходимую для определения, какая ячейка была изменена, и новое значение, которое будет применено к ячейке.Модель также должна генерировать соответствующие события изменения, и этот метод можно вызывать независимо от JTree, что делает его идеальным выбором
...