2011-11-24 46 views
0

我一直在这里搜索,找到了这个问题的答案,但似乎无法让他们为我工作。 Basicly我有一个包含一个JScrollPane内JTree中GUI:JTree与DefaultTreeModel,如何加载后可视化刷新?

private void initComponents() { 

     scroll = new javax.swing.JScrollPane(); 
     nodo padre = new nodo(); 
     modeloArbol modelo = new modeloArbol(padre); 
     arbol = new arbolNodos(modelo); 

我有以下类:

public class arbolNodos extends JTree implements Serializable{ 

    public arbolNodos(TreeModel newModel) { 


public class listenerModeloArbol implements TreeModelListener{ 

//Overriding treeNodes*(TreeModelEvent e) 


public class modeloArbol extends DefaultTreeModel implements Serializable{ 

    public modeloArbol(TreeNode root) { 
     super(root); 
    } 


public class nodo extends DefaultMutableTreeNode implements Serializable{ 

我还具有存储2个按钮(botonGuardarArbol)和检索(botonCargarArbol)使用所述XMLEncoder JTree的(他们真的检索树的根节点)到一个文件中与相应的actionPerformed监听器:

private void botonGuardarArbolActionPerformed(java.awt.event.ActionEvent evt) {             
// TODO add your handling code here: 
    try { 
     XMLEncoder encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("C:\\borrar\\presupuesto"))); 
     encoder.writeObject(arbol.getModel().getRoot()); 
     encoder.close(); 



private void botonCargarArbolActionPerformed(java.awt.event.ActionEvent evt) {             
// TODO add your handling code here:  
    try { 
     XMLDecoder decoder = new XMLDecoder(new BufferedInputStream(new FileInputStream("C:\\borrar\\presupuesto"))); 

     nodo padre = (nodo) decoder.readObject(); 

     modeloArbol modelo = new modeloArbol(padre); 

     decoder.close(); 

     modelo.setRoot(padre); 

    arbolNodos arbolNuevo = null; 

     if(modelo != null){ 
      arbolNuevo = new arbolNodos(modelo); 
      arbol = null; 
      arbol = arbolNuevo; 

      ((DefaultTreeModel)arbol.getModel()).reload(); 
     } 
     else 
      arbolNuevo = new arbolNodos(); 

的事情是,当我找回存储的JTree,我知道它很好的检索,因为我尝试在树的所有节点内打印属性,并且它们都可以,但是当我尝试在Swing中放置它时,它不会刷新并且视图块(即。我无法在加载之前在JTree中操作任何东西)。我已经尝试了刷新/更新JTree的无数线程,但无法修复它。我怎样才能做到这一点?

谢谢

+0

请学习java的命名约定并坚持到他们 – kleopatra

回答

4
if(modelo != null) 
{ 
    arbolNuevo = new arbolNodos(modelo); // 
    arbol = null; 
    arbol = arbolNuevo; 
    ((DefaultTreeModel)arbol.getModel()).reload(); 
}   
else 
    arbolNuevo = new arbolNodos(); 

不要将创造新的JTree对象。如果你想改变模型,然后只需使用:

tree.setModel(...); 

而且,你为什么延长的JTree,DefaultTreeModel的,DefaultMutableTreeNode?如果出于某种原因,您确实需要扩展这些类,那么遵循这些类的标准Java命名约定。类以大写字符开头。

+0

工作就像一个魅力!我也会检查类的Java命名约定...谢谢! – user1064285