2015-05-11 75 views
2

我想用CardLayout使用JTree的內容更改面板。它只在最後的選擇上工作。我應該使用我的代碼來處理哪些聽衆或更改?如何使用JTree Listener使用CardLayout動態更改JPanel?

我也寫在控制檯中的文本,它似乎得到正確的價值。這就是爲什麼我很沮喪。

我的代碼應該在第一級節點被點擊時顯示第一級,而在第二級節點被點擊時應該顯示第二級。我用

DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree 
           .getLastSelectedPathComponent(); 

它只是影響最後的組件。我該如何解決?謝謝!

的源代碼:

import java.awt.BorderLayout; 
import java.awt.CardLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 

public class ProblemTree2 extends JFrame { 

    private DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
    private DefaultTreeModel model = new DefaultTreeModel(root); 
    private JTree tree = new JTree(model); 
    private JPanel card; 

    public ProblemTree2() { 

     card = new JPanel(new CardLayout()); 
     card.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 

     JLabel label1 = new JLabel("1st level"); 
     JLabel label2 = new JLabel("2nd level"); 

     DefaultMutableTreeNode n1 = new DefaultMutableTreeNode(
       "1st level: Child 1"); 
     n1.add(new DefaultMutableTreeNode("2nd level: Child l")); 
     DefaultMutableTreeNode n2 = new DefaultMutableTreeNode(
       "1st level: Child 2"); 
     n2.add(new DefaultMutableTreeNode("2nd level: Child 2")); 
     DefaultMutableTreeNode n3 = new DefaultMutableTreeNode(
       "1st level: Child 3"); 
     n3.add(new DefaultMutableTreeNode("2nd level: Child 3")); 


     card.add(label1,"1st level: Child 1"); 
     card.add(label1,"1st level: Child 2"); 
     card.add(label1,"1st level: Child 3"); 

     card.add(label2,"2nd level: Child l"); 
     card.add(label2,"2nd level: Child 2"); 
     card.add(label2,"2nd level: Child 3"); 

     root.add(n1); 
     root.add(n2); 
     root.add(n3); 

     tree.setEditable(true); 
     tree.setSelectionRow(0); 
     tree.setRootVisible(true); 
     tree.setShowsRootHandles(true); 


     tree.getSelectionModel().addTreeSelectionListener(
       new TreeSelectionListener() { 
        @Override 
        public void valueChanged(TreeSelectionEvent e) { 

         final CardLayout cards = (CardLayout) card 
           .getLayout(); 
         DefaultMutableTreeNode selectedNode = (DefaultMutableTreeNode) tree 
           .getLastSelectedPathComponent(); 
         System.out.println(selectedNode.toString()); 
         cards.show(card,selectedNode.toString()); 
        } 
       }); 


     JScrollPane scrollPane = new JScrollPane(tree); 
     scrollPane.setPreferredSize(new Dimension(500,500)); 
     getContentPane().add(scrollPane, BorderLayout.WEST); 
     getContentPane().add(card, BorderLayout.CENTER); 

     setSize(1000, 600); 
     setVisible(true); 
    } 

    public static void main(String[] arg) { 
     ProblemTree2 pt = new ProblemTree2(); 
    } 
} 

回答

4

這...

card.add(label1, "1st level: Child 1"); 
card.add(label1, "1st level: Child 2"); 
card.add(label1, "1st level: Child 3"); 

card.add(label2, "2nd level: Child l"); 
card.add(label2, "2nd level: Child 2"); 
card.add(label2, "2nd level: Child 3"); 

導致你的問題,你不能分配組件多個鍵的同一個實例。

當您嘗試添加該組件第二次,它首先從它刪除父容器,這是造成CardLayout刪除「名稱」爲好,這意味着只有線...

card.add(label1, "1st level: Child 3"); 
// and... 
card.add(label2, "2nd level: Child 3"); 

實際上正在工作(已添加到UI/CardLayout

您必須爲每個名稱提供組件的新實例。

或者,您可以向您的TreeNode提供更多詳細信息,以便確定它是哪個級別並顯示該級別的正確組件,這意味着您的CardLayout中只有兩個組件,每個級別都有一個組件。

DefaultMutableTreeNode允許您向其提供「用戶」Object。默認情況下,它使用此對象的toString方法作爲節點的文本,但您可以使用TreeCellRenderer來自定義該值或爲「自定義級別」對象的toString方法提供一個值