Ações não atualizam GUI

Olá, tenho o seguinte problema, desevolvia em Swing utilizando o eclipse + JFormDesing. Pois bem, resolvi partir para o netbeans devido as facilidades de lidar com Swing App Framework. Mas, toda a vez que invoco alguma ação que atualize a tela, não funciona. Exemplo: tenho uma tela que tem um botão que ao ser invocado, o usuário seleciona um arquivo xml, este é lido a a JTree logo abaixo deveria ser atualizada com os valores parseados pelo XStream. Depurando o código, tudo funciona normalmente, mas de fato, na tela nada muda. Existe alguma configuração “default” que bloqueia a atualização da tela devido ao uso do Swing App Framework ? Ou alguma outra ? Obs. Já tentei UpdateUI etc e tal e não deu certo.

jovem,

só o fato de atualizar os dados não quer dizer que a “view”… será atualizada…
tenta após atualizar o model desses componentes, atualizar o componente swing.

então meu velho, veja bem, quando é montada a lista de objetos á partir do XStream, eu modifico todos os nodes da tree de acordo com os novos valores. Sempre fiz deste jeito e funcionou, a questão é eu estou atualizando os valores dos componentes swing, no post estava me referindo a eles quando disse que depurei estava tudo ok.

olhe um exemplo de atualização.

http://www.javafree.org/topic-859283-remover-nodo-JTree.html

Robinson, obrigado por sua ajuda. Mas o fato é o seguinte, vou te explicar melhor:
Digamos que eu tenho uma classe que recebe uma determinada lista de objetos, cria um cria a jtree, o model e adiciona em um JScrool. Se eu pegar esta classe e utilizá-la em um simples JPanel em um projeto qualquer no eclipse e fizer “panel.add(jscroolTal)” funciona. O fato é que estou reutilizando a mesma classe em um projeto no netbeans, pois como falei passei a utilizá-lo agora. E mais, aproveitando, tentei fazer um “dual list” exatamente da mesma forma que eu fazia no eclipse e não atualiza a tela. Acho que meu problema é alguma coisa com o netbeans, pois entendi perfeitamente o exemplo que vc me passou. Tenta fazer o seguinte, criar um projeto no netbeans utilizando o modo visual e então coloca uma tree vazia. Então em um botão colocar uma ação para atualizar a tree e então provavelmente não vai funcionar. Este é o meu problema.

Alguma ajuda ?

Essa ação para atualizar a tree que você colocou, esta no próprio JFrame?

Caso a resposta seja sim, tente chamar o seguinte método dentro do JFrame depois de executar a ação, para tentar atualizar a tela:

this.repaint();

Na realidade se for dentro do frame, acho que o deve ser usado o método validate()

Crara, até onde eu sei pra atualizar o Frame o método é esse:

this.repaint();  

Já precisei usar e ele funcionou!

  • Na verdade, o que eu te recomendo mesmo é separar a tela (JFrame) de suas classes.
    Assim você não encontra esses problemas chatos.

poisé, mas como coloquei na explicação anterior, eu já tinha tentado utilizar todos estes métodos (repaint, update etc) tanto no jframe, como no jpanel como na tree. Mas a questão é porque em um projeto no eclipse funciona e no net beans não ? sendo que a única diferença é o fato de eu estar utilizando o swing app framework no projeto do netbeans e no eclipse não …

  1. Tentou o validate()? Esse método é em geral utilizado para atualizar os nós filhos de um componente, já precisei utilizá-lo uma vez.
  2. Será que o NetBeans e Eclipse estão usando a mesma versão de JVM?

Voce após carregar esta setando nesse outro componente os valores? Provavelmente o problema está na sua lógica e não na tecnologia.

alguém tentou fazer oque descrivi acima ?
"Tenta fazer o seguinte, criar um projeto no netbeans utilizando o modo visual e então coloca uma tree vazia. Então em um botão colocar uma ação para atualizar a tree e então provavelmente não vai funcionar. "

Amigo é o seguinte…
O objetivo é fazer funcionar no NetBeans tbm, certo?

Como eu te aconselhei antes:
Separe seu código por camadas, assim vc vai poder ter uma organização melhor, já que estará tudo dividido.

Porque estou te falando isso ???

Porque eu já tive um problema parecido usando o NetBeans, e ele foi resolvido a partir do momento em que eu retirei o método que executava a ação desejada de minha tela e coloquei em uma classe específica. O construtor desta classe que eu criei recebia o meu JFrame como parametro, e com isso dentro da própria classe eu fazia modificações na minha tela.
O construtor da classe ficou + ou - assim:

public Teste(Tela t){    
    }

Onde Tela é o Meu JFrame.

Cara… nunca trabalhei com Trees mas tenho certeza que voce nao implementou seu Model direito.

Ok, então me diga onde está o erro.

public class TreeDir
{

	private static final long serialVersionUID = 1L;
	private DefaultMutableTreeNode treeNode = new DefaultMutableTreeNode();
	public final Repo repo;
	private JTree tree;	
	private JScrollPane scroolTree;

	/**
	 * The constructor, receives a Repo structure.
	 * @param repo
	 */
	public TreeDir(final Repo repo)
	{
		this.repo = repo;
		init();
	}

	/**
	 * Operatios delegated the tree.
	 */
	private void init()
	{
		fillNodes(repo.getDir(), treeNode);
		tree = new JTree(treeNode, true);
		DefaultTreeCellRenderer renderer = 
			new DefaultTreeCellRenderer();
		    try
				{
					renderer.setOpenIcon(Util.getIcon("ico_esc.gif"));
					renderer.setIcon(Util.getIcon("repo.gif"));
					tree.setCellRenderer(renderer);
				}
				catch (IOException e)
				{
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
		    tree.setCellRenderer(renderer);

		expandAll(tree, true);
		scroolTree = new JScrollPane(tree);		
	}
	
	/**
	 * The scrool with jtree object.
	 * @return
	 */
	public JScrollPane getScrTree()
	{
		return scroolTree;
	}

	/**
	 * Fill the tree object.
	 * @param thisDir
	 * @param thisNode
	 */
	private void fillNodes(Dir thisDir, DefaultMutableTreeNode thisNode)
	{
		try
		{
			DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(thisDir.getName());
			thisNode.add(newNode);
			if (thisDir.getChilds() != null && !thisDir.getChilds().isEmpty())
			{
				for (Dir dir : thisDir.getChilds())
				{
					fillNodes(dir, newNode);
				}
			}
		}
		catch (Exception e)
		{
			e.printStackTrace();
		}
	}
	
  /**
   * Expand all dirs.
   * If expand is true, expands all nodes in the tree.
   * Otherwise, collapses all nodes in the tree.
   * @param tree
   * @param expand
   */
  public void expandAll(JTree tree, boolean expand) {
      TreeNode root = (TreeNode)tree.getModel().getRoot();
  
      // Traverse tree from root
      expandAll(tree, new TreePath(root), expand);
  }
  
  @SuppressWarnings("unchecked")
	private void expandAll(JTree tree, TreePath parent, boolean expand) {
      // Traverse children
      TreeNode node = (TreeNode)parent.getLastPathComponent();
      if (node.getChildCount() >= 0) {
          for (Enumeration<TreeNode> e=node.children(); e.hasMoreElements(); ) {
              TreeNode n = e.nextElement();
              TreePath path = parent.pathByAddingChild(n);
              expandAll(tree, path, expand);
          }
      }
  
      // Expansion or collapse must be done bottom-up
      if (expand) {
          tree.expandPath(parent);
      } else {
          tree.collapsePath(parent);
      }
  }


}

Aonde está um Listener para ver as ações e chamar esses métodos?

E outra coisa.
NÃO use DefaultMutableTreeNode e nada com Default. Crie o seu próprio. Voce vai ver que fica muito mais interessante.

Bom então veja só, se você leu o começo da história vai entender meu problema no meu projeto JAVA no eclipse, a MESMA implementação funciona !!! No netBeans não e a única diferença é o fato de ser uma aplicação com suporte ao Swing App Framework. E quanto a default, não vejo problemas em utilizá-los, ainda mais no meu caso que é somente visualização. Faça o teste que comentei e se funcionar, aí sim vc conseguiu descobrir meu problema.

Ahh… então o problema é o Netbeans… eu já nem gosto dele pra falar a verdade ^^

Eu nunca trabalhei com Trees então eu só postei de acordo com os padrões do Swing.

Mesmo sendo “só pra visualização” implementar o próprio model continua sendo mais interessante.

Já tentou criar o projeto sem o suporte ao swing app framework? Faça um teste, quem sabe não é com ele o problema.