2011-11-24 56 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