setUserObject na TreeView ocasiona problemas

2 respostas
R

Oi,
Estou preenchendo uma árvore (JTree) com um modelo de dados. Beleza. O problema é que, quando utilizo o método setUserObject para associar um objeto ao nodo, o texto do nodo é modificado.
Pergunto. Como (re)defino o texto do nodo da árvore sem ser através do construtor do nodo?

PS. Já achei uma dica no Google que eu deveria sobreescrever o método toString() do objeto que eu passo para o setUserObject. Entretanto, isso ficaria inviável, uma vez que não conheço a priori os tipos dos objetos a serem colocados na árvore.

2 Respostas

cariocathi

sobrescreva o toString em TODOS os seus objetos… :idea:

R

Oi,
Como eu disse na mensagem, sobreescrever o toString() não resolve pois e não sei quais objetos serão colocados na árvore.

Mas consegui de outra forma. Extendi a classe DefaultTreeCellRenderer e sobreescrevi o método getTreeCellRendererComponent() colocando o texto que eu quero dentro.

Ficou assim:

public class ModeloDePermissoesTreeCellRender extends DefaultTreeCellRenderer {

	/**
	 * Chama o método da classe mãe e define o texto do nodo com base nas informações
	 * armazenadas em <i>userObject</i>.
	 * @see javax.swing.tree.TreeCellRenderer#getTreeCellRendererComponent(javax.swing.JTree, java.lang.Object, boolean, boolean, boolean, int, boolean)
	 */
	public Component getTreeCellRendererComponent(JTree tree, Object value,
			boolean sel,	boolean expanded,	boolean leaf,	int row,	boolean hasFocus) {
		super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf,
				row, hasFocus);

		//Se o objeto for um frame, coloca no nodo o título do frame
		//Se o objeto for um componente, coloca o tooltip do objeto ou um texto genérico
		//Caso contrário, coloca uma mensagem informando que não é possível aplicar permissões no objeto
		if (((DefaultMutableTreeNode)value).getUserObject() instanceof JFrame) {
			setText(((JFrame)((DefaultMutableTreeNode)value).getUserObject()).getTitle());
		} else if (((DefaultMutableTreeNode)value).getUserObject() instanceof JComponent) {
				if (((JComponent)((DefaultMutableTreeNode)value).getUserObject()).getToolTipText() != null ) {
					setText(((JComponent)((DefaultMutableTreeNode)value).getUserObject()).getToolTipText());	
				} else {
					setForeground(Color.GRAY);
					setText("Objeto sem descrição");
				}
		} else {
			setForeground(Color.RED);
			setText("Objeto indefinido. Permissões não são aplicáveis");			
		}
		
		return this;
	}								
}

Agora faz exatamente o que eu quero.

Criado 8 de dezembro de 2003
Ultima resposta 8 de dez. de 2003
Respostas 2
Participantes 2