2012-09-30 38 views
0

我有擴展JTree的奇怪問題。我嘗試將JTree添加到JScrollPane。
樹應該恢復到擴展狀態,但它不工作 - 樹被摺疊。
下面的代碼:當JTree被添加到JScrollPane時,JTree擴展路徑不起作用

if (expansionState != null) { 
     while (expansionState.hasMoreElements()) { 
      TreePath treePath = (TreePath) expansionState.nextElement(); 
      tree.expandPath(treePath); 
     } 
    } 

    m_Scroll = new JScrollPane(tree); 
    m_Scroll.setBounds(100, 100, 800, 200); 
    mainFrame.getContentPane().add(m_Scroll); 
    mainFrame.revalidate(); 

當我directrly添加的JTree的框架沒有JScrollPane的正常工作,這裏的代碼:

if (expansionState != null) { 
    while (expansionState.hasMoreElements()) { 
     TreePath treePath = (TreePath) expansionState.nextElement(); 
     tree.expandPath(treePath); 
    } 
} 

    //m_Scroll = new JScrollPane(tree); 
    tree.setBounds(100, 100, 800, 200); 
    mainFrame.getContentPane().add(tree); 
    mainFrame.revalidate(); 
+0

永遠不會做手動調整大小/定位,這是合適的LayoutManager的工作 – kleopatra

回答

4

由於捕獲擴張狀態的代碼沒有顯示以下可能只是一個瘋狂的猜測。假設expansionStateEnumeration可能會出現一種情況,您已經枚舉了其所有元素一次,達到其結尾,現在hasMoreElements()始終返回false。因此,您無法恢復狀態。

請考慮下面的演示,演示類似的情況,但在展開後重新捕獲展開狀態。或者,您可以將擴展狀態緩存到List或類似的集合中。

import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Enumeration; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.TreePath; 

public class TestTree { 
    private Enumeration<TreePath> expansionState; 

    public TestTree() { 
     JFrame frame = new JFrame("TestTree"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setLocationRelativeTo(null); 

     final JTree tree = new JTree(buildDemoModel()); 

     JPanel buttonsPanel = new JPanel(); 

     JButton saveButton = new JButton("Capture state"); 
     saveButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       expansionState = saveExpansionState(tree); 
      } 
     }); 

     JButton loadButton = new JButton("Load state"); 
     loadButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       loadExpansionState(tree, expansionState); 
       //recapture the expansion state 
       expansionState = saveExpansionState(tree); 
      } 

     }); 

     buttonsPanel.add(saveButton); 
     buttonsPanel.add(loadButton); 

     JPanel content = new JPanel(new BorderLayout()); 
     content.add(buttonsPanel, BorderLayout.SOUTH); 
     content.add(new JScrollPane(tree), BorderLayout.CENTER); 

     frame.add(content); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static Enumeration<TreePath> saveExpansionState(JTree tree) { 
     return tree.getExpandedDescendants(new TreePath(tree.getModel().getRoot())); 
    } 

    public static void loadExpansionState(JTree tree, Enumeration<TreePath> enumeration) { 
     if (enumeration != null) { 
      while (enumeration.hasMoreElements()) { 
       TreePath treePath = enumeration.nextElement(); 
       tree.expandPath(treePath); 
      } 
     } 
    } 

    public static DefaultTreeModel buildDemoModel() { 
     DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 

     DefaultMutableTreeNode childNode = new DefaultMutableTreeNode("A"); 
     childNode.add(new DefaultMutableTreeNode("A1")); 
     childNode.add(new DefaultMutableTreeNode("A2")); 
     root.add(childNode); 

     childNode = new DefaultMutableTreeNode("B"); 
     childNode.add(new DefaultMutableTreeNode("B1")); 
     childNode.add(new DefaultMutableTreeNode("B2")); 
     root.add(childNode); 

     return new DefaultTreeModel(root); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestTree(); 
      } 
     }); 
    } 

}