Неопределенности в отношении реализации действий и использования одной модели с несколькими представлениями

Я новичок в программировании с графическим интерфейсом и, возможно, у меня проблема довольно простое решение. Я пытаюсь реализовать графический интерфейс Java Swing, который служит редактор для дерева, как структура данных. Графический интерфейс делится на три части:

A tree viewer in the left quarter of the window displays the tree structured data.

The large upper right area displays editors containing text fields, tables and the like. Each different kind of object in the tree structure has its own editor which is shown when it is selected in the tree viewer.

The lower right area shows a console viewer. It is used to display messages about specific actions.

Я изо всех сил стараюсь придерживаться строгого отделения модели от ее визуализация в дереве зрителей / редакторов в моей программе. Следовательно, я создал экземпляр подкласса DefaultTreeModel (MyTreeModel) который хранит ссылки на бизнес-данные и экземпляр подкласс JTree, который обеспечивает визуальное представление дерева состав.

Я пытаюсь реализовать функциональность, которая изменяет данные, используя Классы действий. Любое действие (например, CreateNode, RenameNode, DeleteNode) реализован в собственном классе действий (подкласс AbstractAction). Действия используются в контекстном меню средства просмотра дерева и в приложения & quot; Изменить & quot; меню. Но я также хочу повторно использовать некоторые из них в части редактора GUI, например действие RenameNode. И вот я в данный момент застрял.

Дерево просмотра отображает значок вместе с именем для каждого узла в дерево. И соответствующий редактор содержит, среди прочего вещи, также JTextField, который показывает имя связанного узла.

Я знаю, что могу прикрепить объекты действий к JMenu, JPopupMenu и даже для объектов JTextField, используя метод setAction. я сделал так, и теперь у меня есть "Переименовать" запись в меню "Редактировать" программы "s" меню, во всплывающем меню, связанном с JTree, которое представляет просмотрщик дерева и JTextField, показывающий имя узла, также имеют действие прилагается к нему.

Чтобы изменить & quot; Имя & quot; атрибут узла дерева, я создал класс RenameNode как подкласс AbstractAction. Как уже упоминалось имя отображается на каждом узле в дереве просмотра и действия просто делает этот текст редактируемым. Код, делающий это, выглядит следующим образом (в классе RenameNode):

public void actionPerformed(ActionEvent ev) {
    // "mouseOverPath" is the Treepath were the mouse was placed on
    // when the popup menu was opened
    if (tree.existsMouseOverPath()) {
        tree.startEditingAtPath(tree.mouseOverPath);
    } else if (tree.getSelectionCount() != 0) {
        tree.startEditingAtPath(tree.getSelectionPath());
    }
}

Эти операторы if необходимы для правильной работы действия:

- всплывающее меню (первый оператор if; здесь объект, который был под мышь при открытии всплывающего меню становится редактируемой)

- меню приложения (второй оператор if; здесь узел дерева то, что в данный момент выбрано - если есть - становится редактируемым).

Ну, это в принципе работает нормально, но на самом деле переименование узел не выполняется с помощью кода в классе RenameAction actionPerformed (ActionEvent ev) метод. Реальное изменение узла имя выполняется в древовидном классе MyTreeModel в методе valueForPathChanged (), который переопределяется следующим образом:

public class MyTreeModel extends DefaultTreeModel {


[...]

    @Override
    public void valueForPathChanged(TreePath path, Object newValue) {
    final MyTreeNode aNode = (MyTreeNode)path.getLastPathComponent();
    if (newValue instanceof String) {
        ((MyNode) aNode.getUserObject()).setName((String) newValue);
    } else {
        aNode.setUserObject(newValue);
    }
        nodeChanged(aNode);
    }

[...]

}

Я понятия не имею, как концепция действий может быть правильно применяется здесь. Еще хуже ситуация с операцией переименования, когда она выполнено изменение текста в объекте JTextField. На данный момент я не знаю, как реализовать это в чистом виде. JTextField должен связать с одним узлом из структуры древовидной модели в качестве его модель и прилагаемое действие должны изменить эту модель и когда это модель изменена, для просмотра дерева необходимо получить уведомление об обновлении имя соответствующего узла в дереве просмотра.

Я предполагаю, что класс MyNode (который является подклассом DefaultMutableTreeNode) должен был бы реализовать интерфейс Document и класс RenameAction должен будет изменить его, а затем событие должно быть выдано, чтобы уведомить дерево просмотра, которое отображает изменил узел.

Итог: я должен признать, что я еще не совсем понял, как правильно реализовать действие, которое будет использоваться в нескольких местах в графическом интерфейсе, и я не совсем понимаю, как реализовать модель которые могут использоваться несколькими объектами GUI (в моем случае JTree и JTextField). Возможно, все это довольно просто ...

Заранее благодарю за любую помощь!

Хорошо, приведенные ответы были весьма полезны для объяснения того, как действия можно использовать вместе с JTrees Но есть еще один момент, который я хотел бы обсудить. В моем графическом интерфейсе у меня есть представление моих бизнес-данных в виде дерева с редакторами данных (дерево, расположенное в левой четверти окна и кроме него - редактор, специфичный для типа узла). Все узлы имеют имена, которые можно изменить. Кроме того, редакторы содержат текстовое поле (реализованное с помощью JTextField), в котором отображается имя узла и которое также можно редактировать. Моя неопределенность здесь заключается в следующем: JTextField позволяет назначить объект действия, а также модель к нему. На самом деле модель будет объектом узла, уже просмотренным в JTree. Я думаю, что должен быть способ использовать тот же объект модели, который используется в JTree, также в качестве модели для JTextField в редакторе, а также повторно использовать там класс Action. Что касается повторного использования модели, я думаю, что мой класс модели MyTreeNode должен будет также реализовать интерфейс Document, правильно? И при вызове редактора, специфичного для узла, я должен связать узел, выбранный в данный момент в JTree, с объектом JTextField, используя его метод setDocument (). Наконец мой RenameNodeAction должен будет выполнить изменение Имя узла JTextField. Итак, моя главная идея: сделать так, чтобы одна модель отображалась в нескольких представлениях, и повторное использование только одного RenameAction везде, где должен быть переименован узел. Имеет ли это смысл, и моя идея, как это должно быть осуществимо?

Ответы на вопрос(3)

Ваш ответ на вопрос