2012-07-19 2 views
2

Java Swing 응용 프로그램을 시작할 때 XML 파일을 DefaultTreeModel로 읽고, 모델로 새 JTree를 만들고, JTrollPane에 jtree를 추가하고, Life는 Good입니다. 모든 작동합니다JTree : 새 모델을 다시 표시하지 않습니다

// Program initialization: 
jarFilesDB = new JarFilesDB(); 
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME); 
jtree = new JTree(jarFilesDB.getRootNode()); 
JScrollPane scrollPane = new JScrollPane (jtree); 
contentPane.add(scrollPane, BorderLayout.CENTER); 

을 나중에, 나는 새로운 XML 파일을 만들려면, 완전히 내 모델을 재 구축 할 수 있습니다. 이 작업을 수행 할 때 jtree에서 새 모델을 다시 표시 할 수 없습니다. 어느 나는 빈 창을 얻거나 이전 모델은 여전히 ​​표시

// Completely regenerate XML file and Model 
jarFilesDB.mkXmlFile (sPath);    // Generate new XML file 
jarFilesDB.load(JarFilesDB.JAR_DB_FILENAME); // Generate new Model 

당 앤드류 톰슨의 요청, 내가 쓴 "(가능한 한) 짧은,자가 포함 된 (수정되지 않았거나 내가하지 않을 것입니다!) 예) 질문 :..의 끝에서

nodeStructureChanged(rootNode); 

: 방법이 업데이트를 발생하지 않는

package com.rgb; 

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JTree; 
import javax.swing.JScrollPane; 
import javax.swing.tree.*; 

public class FrmMain extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        FrmMain frame = new FrmMain(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public FrmMain() { 
     setTitle("HelloJTree3"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JButton btnNewButton = new JButton("Click Me"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       doClick(); 
      } 
     }); 
     contentPane.add(btnNewButton, BorderLayout.NORTH); 
     jarFilesDB = new JarFilesDB(); 
     jarFilesDB.load(isAlpha); 
     isAlpha = !isAlpha; 
     jtree = new JTree(jarFilesDB.getRootNode()); 
     JScrollPane scrollPane = new JScrollPane (jtree); 
     contentPane.add(scrollPane, BorderLayout.CENTER); 
    } 

    private void doClick() { 
     jarFilesDB.load(isAlpha); 
     isAlpha = !isAlpha; 
    } 

    private JarFilesDB jarFilesDB; 
    private JTree jtree; 
    private boolean isAlpha = false; 
} 

class JarFilesDB extends DefaultTreeModel { 

    public JarFilesDB() { 
     super (null); 
    } 

    public void load (boolean isAlpha) { 
     if (rootNode == null) 
      rootNode = new DefaultMutableTreeNode("root"); 
     else 
      rootNode.removeAllChildren(); 

     String[] values; 
     if (isAlpha) 
      values = new String[] {"A", "A1", "A2", "B", "B1", "B2"}; 
     else 
      values = new String[] {"10", "11", "12", "20", "21", "22"}; 

     DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]); 
     DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]); 
     childNode.add(leafNode); 
     leafNode = new DefaultMutableTreeNode (values[2]); 
     childNode.add(leafNode); 
     rootNode.add(childNode); 

     childNode = new DefaultMutableTreeNode (values[3]); 
     leafNode = new DefaultMutableTreeNode (values[4]); 
     childNode.add(leafNode); 
     leafNode = new DefaultMutableTreeNode (values[5]); 
     childNode.add(leafNode); 
     rootNode.add(childNode); 
    } 

    public TreeNode getRootNode() { 
     return rootNode; 
    } 

    private DefaultMutableTreeNode rootNode = null; 

} 
+1

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+1

트리를 초기화 할 때'jtree.setModel (jarFilesDB);'를 사용하지 않는 이유는 무엇입니까? – tenorsax

+0

@Max - class jarFilesDB는 DefaultTreeModel에서 상속받습니다. 처음에는 jtree의 생성자로 모델의 루트 노드를 사용하기 때문에 처음에는 "setModel()"이 필요하지 않습니다. 삭제 한 응답은 정확합니다. removeAll() 또는 setModel()을 * 사용하면 안됩니다. 모든 제안은 분명히 고맙게 여길 것입니다. Thanx in advance ... – paulsm4

답변

3

add() 그것은 가장 적합한 것은 insertNodeInto를 사용하여 해결하려면 다음을 추가방법.

그리고 트리를 초기화하려면이 옵션을 사용

여기
jtree = new JTree(jarFilesDB); 

업데이트 된 SSCCE, 확실하지 rootNode의 목적은 무엇인가, 그래서 나는 혼자 남아

import java.awt.BorderLayout; 
import java.awt.EventQueue; 

import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.border.EmptyBorder; 
import javax.swing.JButton; 
import java.awt.event.ActionListener; 
import java.awt.event.ActionEvent; 
import javax.swing.JTree; 
import javax.swing.JScrollPane; 
import javax.swing.tree.*; 

public class FrmMain extends JFrame { 

    private JPanel contentPane; 

    /** 
    * Launch the application. 
    */ 
    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       try { 
        FrmMain frame = new FrmMain(); 
        frame.setVisible(true); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }); 
    } 

    /** 
    * Create the frame. 
    */ 
    public FrmMain() { 
     setTitle("HelloJTree3"); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(100, 100, 450, 300); 
     contentPane = new JPanel(); 
     contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); 
     contentPane.setLayout(new BorderLayout(0, 0)); 
     setContentPane(contentPane); 

     JButton btnNewButton = new JButton("Click Me"); 
     btnNewButton.addActionListener(new ActionListener() { 
      public void actionPerformed(ActionEvent arg0) { 
       doClick(); 
      } 
     }); 
     contentPane.add(btnNewButton, BorderLayout.NORTH); 
     jarFilesDB = new JarFilesDB(); 
     jarFilesDB.load(isAlpha); 
     isAlpha = !isAlpha; 
     //jtree = new JTree(jarFilesDB.getRootNode()); 
     jtree = new JTree(jarFilesDB); 
     JScrollPane scrollPane = new JScrollPane (jtree); 
     contentPane.add(scrollPane, BorderLayout.CENTER); 
    } 

    private void doClick() { 
     jarFilesDB.load(isAlpha); 
     isAlpha = !isAlpha; 
    } 

    private JarFilesDB jarFilesDB; 
    private JTree jtree; 
    private boolean isAlpha = false; 
} 

class JarFilesDB extends DefaultTreeModel { 

    public JarFilesDB() { 
     super (new DefaultMutableTreeNode("root")); 
     rootNode = (DefaultMutableTreeNode) getRoot(); 
    } 

    public void load (boolean isAlpha) { 
     rootNode.removeAllChildren(); 

     String[] values; 
     if (isAlpha) 
      values = new String[] {"A", "A1", "A2", "B", "B1", "B2"}; 
     else 
      values = new String[] {"10", "11", "12", "20", "21", "22"}; 

     DefaultMutableTreeNode childNode = new DefaultMutableTreeNode (values[0]); 
     DefaultMutableTreeNode leafNode = new DefaultMutableTreeNode (values[1]); 
     childNode.add(leafNode); 
     leafNode = new DefaultMutableTreeNode (values[2]); 
     childNode.add(leafNode); 

     rootNode.add(childNode); 

     childNode = new DefaultMutableTreeNode (values[3]); 
     leafNode = new DefaultMutableTreeNode (values[4]); 
     childNode.add(leafNode); 
     leafNode = new DefaultMutableTreeNode (values[5]); 
     childNode.add(leafNode); 
     rootNode.add(childNode); 

     nodeStructureChanged(rootNode); 
    } 

    public TreeNode getRootNode() { 
     return rootNode; 
    } 

    private DefaultMutableTreeNode rootNode = null; 

} 
+0

아름다운, 고마워! 그것은 이제 매력처럼 작동합니다! – paulsm4

+0

@ paulsm4 기뻤습니다! – tenorsax

1

을 또는 당신이 할 수있는 그냥 사용하십시오 JTree.updateUI()

관련 문제