Incertezas em relação à Implementação de Ações e Uso de um Único Modelo com Diversas Visualizações

Eu sou um novato total sobre programação GUI e talvez o meu problema tenha uma solução bastante simples. Eu estou tentando implementar uma GUI Java Swing que serve como um editor para uma árvore como estrutura de dados. A GUI é dividida em três partes:

Um visualizador de árvore no quarto esquerdo da janela exibe os dados estruturados da árvore.

A área superior direita grande exibe editores contendo campos de texto, tabelas e similares. Cada tipo diferente de objeto na estrutura de árvore possui seu próprio editor, que é mostrado quando é selecionado no visualizador de árvore.

A área inferior direita mostra um visualizador de console. É usado para exibir mensagens sobre ações específicas.

Estou tentando obedecer a uma separação estrita do modelo de sua visualização nos visualizadores / editores de árvore do meu programa. Portanto, criei uma instância de uma subclasse de DefaultTreeModel (MyTreeModel) que armazena referências aos dados de negócios e uma instância de uma subclasse de JTree que fornece a representação visual da estrutura em árvore.

Eu estou tentando implementar a funcionalidade que modifica os dados usando classes de ação. Qualquer ação (como CreateNode, RenameNode, DeleteNode) é implementada em sua própria classe de ação (subclasse de AbstractAction). As ações são usadas no menu de contexto do visualizador em árvore e no menu "Editar" das aplicações. Mas também quero reutilizar algumas delas nas partes do editor da GUI, por exemplo, a ação RenameNode. E aqui estou atualmente preso.

O visualizador de árvore exibe um ícone junto com o nome de cada nó da árvore. E o respectivo editor contém, entre outras coisas, também um JTextField que mostra o nome do nó associado.

Eu sei que posso anexar objetos de ação ao JMenu, JPopupMenu e até mesmo a objetos JTextField usando o método setAction. Eu fiz isso e agora eu tenho uma entrada menue "Renomear" no menu "Editar" do programa, no menu pop-up associado ao JTree que representa o visualizador de árvore e o JTextField mostrando o nome do nó também tem essa ação anexada a ele.

Para alterar o atributo "Nome" de um nó da árvore, criei a classe RenameNode como uma subclasse de AbstractAction. Como já mencionado, o nome é exibido em cada nó no visualizador de árvore e a ação simplesmente torna esse texto editável. O código fazendo isso se parece com o seguinte (na classe 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());
    }
}

Estas instruções if são necessárias para que a ação funcione corretamente a partir de:

- o menu pop-up (primeiro se a instrução; aqui o objeto que estava sob o mouse quando o menu pop-up é aberto é feito editável)

- o menu da aplicação (segundo, se a instrução; aqui o nó da árvore que está atualmente selecionado - se houver - é feito editável).

Bem, isso funciona bem, em princípio, mas na verdade a renomeação do nó não é feita através do código no método actionPerformed (ActionEvent ev) da classe RenameAction. A mudança real do nome do nó é executada na classe MyTreeModel da árvore no método valueForPathChanged (), que é sobrescrito da seguinte forma:

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

[...]

}

Eu não tenho absolutamente nenhuma idéia de como o conceito de ações poderia ser aplicado corretamente aqui. Pior ainda é a situação com a operação de renomeação quando é executada a alteração do texto no objeto JTextField. No momento não sei como implementar isso de maneira limpa. O JTextField deve ser associado a um único nó da estrutura de modelo de árvore como seu modelo e a ação anexada deve modificar esse modelo e, quando esse modelo é alterado, o visualizador de árvore precisa ser notificado para atualizar o nome do respectivo nó no visualizador de árvore.

Eu assumo que a classe MyNode (que é alrady uma subclasse de DefaultMutableTreeNode) teria que implementar a interface Document e a classe RenameAction teria que modificá-la e então um evento teria que ser emitido para notificar o visualizador de árvore que exibe o nó alterado.

Conclusão: devo admitir que ainda não entendi completamente como implementar adequadamente uma ação que deve ser usada em vários lugares em uma GUI e não entendo completamente como implementar um modelo que possa ser usado por vários objetos da GUI (no meu caso um JTree e um JTextField). Possivelmente tudo isso é bem simples ...

Agradecemos antecipadamente por qualquer ajuda!

Bem, as respostas dadas foram bastante úteis para explicar como as ações podem ser usadas junto com JTrees. Mas há mais um ponto que gostaria de discutir. Na minha GUI eu tenho uma representação em árvore dos meus dados de negócios combinados com editores para os dados (a árvore localizada no quarto esquerdo da janela e à parte dela um editor específico do tipo de nó). Todos os nós têm nomes que podem ser alterados. E os editores contêm um campo de texto (implementado com um JTextField) no qual o nome do nó é exibido e que também pode ser editado. Minha incerteza aqui é a seguinte: Um JTextField permite atribuir um objeto de ação, bem como um modelo a ele. Na verdade, o modelo seria um objeto de nó já visto no JTree. Eu acho que deveria haver uma maneira de usar o mesmo objeto de modelo usado no JTree também como um modelo para o JTextField no editor e também reutilizar a classe Action lá. Em relação à reutilização do modelo, acho que minha classe de modelo MyTreeNode terá que implementar a interface Document também, correto? E ao trazer o editor específico do nó, eu teria que associar o nó atualmente selecionado no JTree ao objeto JTextField usando o método setDocument (). Finalmente, meu RenameNodeAction teria que executar a mudança do nome do nó do JTextField. Então, meu ponto central é: fazer um modelo sendo exibido em múltiplas visualizações e a reutilização de apenas uma RenameAction em todos os lugares onde um nó deve ser renomeado. Isso faz sentido e minha idéia é como isso deve ser feito viável?

questionAnswers(3)

yourAnswerToTheQuestion