2012-07-19 97 views
2

当我启动我的Java swing应用程序时,我将XML文件读入DefaultTreeModel,使用模型创建一个新的JTree,将jtree添加到JScrollPane,并且Life is 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 

每安德鲁·汤普森的要求下,我写了一个“短(尽可能)的,自包含的,正确的(没有或我不会!问这个问题)例):。

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/)。 – 2012-07-19 03:31:05

+1

为什么不使用'jtree.setModel(jarFilesDB);'当初始化树时? – tenorsax 2012-07-19 03:47:07

+0

@Max - 类jarFilesDB继承自DefaultTreeModel。我最初不需要“setModel()”,因为我只是使用模型的根节点作为jtree的构造函数。您删除的回复是正确的:我*不应该*需要removeAll()或setModel()。任何建议肯定会被赞赏:) Thanx提前... – paulsm4 2012-07-19 05:02:47

回答

3

add()方法不火的更新最好是使用insertNodeInto要修复,添加以下内容:

nodeStructureChanged(rootNode); 

截至结束方法。

,并以此来初始化树:

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 2012-07-19 16:43:30

+0

@ paulsm4很高兴它解决了! – tenorsax 2012-07-20 06:05:01

1

或者,你可以只需使用JTree.updateUI()