2012-09-30 2 views
0

JTree의 확장에 이상이 있습니다. JTree를 JScrollPane에 추가하려고합니다.
트리가 확장 상태로 복원되어야하지만 작동하지 않습니다 - 트리는 접혀 있습니다. 내가 JScrollPane의없이 프레임에 directrly JTree를 추가 할 때 잘, 여기에 코드를 작동JTree가 JScrollPane에 추가 될 때 JTree expandPath가 작동하지 않습니다.

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(); 

: 여기
코드 확장 상태를 캡처 코드 때문에

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(); 
      } 
     }); 
    } 

} 
관련 문제