2012-09-27 45 views
2

我有一個DeafultTreeModel樹,它有三個級別的節點。我希望能夠讓根節點及其直接子節點不可選。而第三級兒童節點應該是可選擇的。有人可以幫助我這個。我是Swing的新手,希望有人能幫助我,因爲我無法在任何地方找到答案。用小孩創建不可選擇的DefaultTreeModel節點

+3

你可能會需要提供你自己的[選擇模型(http://docs.oracle.com/javase/7/docs/api/ javax/swing/tree/TreeSelectionModel.html)可以確定是否應該進行選擇 – MadProgrammer

+0

感謝您的幫助 –

+0

對於那些只希望根節點不可選的人來說,在點擊監聽器中可以添加類似這在你的TreeSelectionListener :: valueChanged()中:if(node == null || node.isRoot()){return; }' – lfxgroove

回答

8

正如@MadProgrammer所解釋的那樣,您需要提供您自己的選擇模型。基本策略是通過包裝默認選擇模型並將所有方法調用委託給它來實現選擇模型,但是過濾不希望被選擇的TreePath。

這是一個小例子。它採用的方法canPathBeAdded過濾路徑選擇:

import java.beans.PropertyChangeListener; 
import java.util.ArrayList; 
import java.util.List; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeModel; 
import javax.swing.tree.DefaultTreeSelectionModel; 
import javax.swing.tree.RowMapper; 
import javax.swing.tree.TreePath; 
import javax.swing.tree.TreeSelectionModel; 

public class TestTreeSelection { 

    private class MyTreeSelectionModel implements TreeSelectionModel { 

     TreeSelectionModel selectionModel = new DefaultTreeSelectionModel(); 

     private boolean canPathBeAdded(TreePath treePath) { 
      return treePath.getPathCount() > 2; 
     } 

     private TreePath[] getFilteredPaths(TreePath[] paths) { 
      List<TreePath> returnedPaths = new ArrayList<TreePath>(paths.length); 
      for (TreePath treePath : paths) { 
       if (canPathBeAdded(treePath)) { 
        returnedPaths.add(treePath); 
       } 
      } 
      return returnedPaths.toArray(new TreePath[returnedPaths.size()]); 
     } 

     @Override 
     public void setSelectionMode(int mode) { 
      selectionModel.setSelectionMode(mode); 
     } 

     @Override 
     public int getSelectionMode() { 
      return selectionModel.getSelectionMode(); 
     } 

     @Override 
     public void setSelectionPath(TreePath path) { 
      if (canPathBeAdded(path)) { 
       selectionModel.setSelectionPath(path); 
      } 
     } 

     @Override 
     public void setSelectionPaths(TreePath[] paths) { 
      paths = getFilteredPaths(paths); 
      selectionModel.setSelectionPaths(paths); 
     } 

     @Override 
     public void addSelectionPath(TreePath path) { 
      if (canPathBeAdded(path)) { 
       selectionModel.addSelectionPath(path); 
      } 
     } 

     @Override 
     public void addSelectionPaths(TreePath[] paths) { 
      paths = getFilteredPaths(paths); 
      selectionModel.addSelectionPaths(paths); 
     } 

     @Override 
     public void removeSelectionPath(TreePath path) { 
      selectionModel.removeSelectionPath(path); 
     } 

     @Override 
     public void removeSelectionPaths(TreePath[] paths) { 
      selectionModel.removeSelectionPaths(paths); 
     } 

     @Override 
     public TreePath getSelectionPath() { 
      return selectionModel.getSelectionPath(); 
     } 

     @Override 
     public TreePath[] getSelectionPaths() { 
      return selectionModel.getSelectionPaths(); 
     } 

     @Override 
     public int getSelectionCount() { 
      return selectionModel.getSelectionCount(); 
     } 

     @Override 
     public boolean isPathSelected(TreePath path) { 
      return selectionModel.isPathSelected(path); 
     } 

     @Override 
     public boolean isSelectionEmpty() { 
      return selectionModel.isSelectionEmpty(); 
     } 

     @Override 
     public void clearSelection() { 
      selectionModel.clearSelection(); 
     } 

     @Override 
     public void setRowMapper(RowMapper newMapper) { 
      selectionModel.setRowMapper(newMapper); 
     } 

     @Override 
     public RowMapper getRowMapper() { 
      return selectionModel.getRowMapper(); 
     } 

     @Override 
     public int[] getSelectionRows() { 
      return selectionModel.getSelectionRows(); 
     } 

     @Override 
     public int getMinSelectionRow() { 
      return selectionModel.getMinSelectionRow(); 
     } 

     @Override 
     public int getMaxSelectionRow() { 
      return selectionModel.getMaxSelectionRow(); 
     } 

     @Override 
     public boolean isRowSelected(int row) { 
      return selectionModel.isRowSelected(row); 
     } 

     @Override 
     public void resetRowSelection() { 
      selectionModel.resetRowSelection(); 
     } 

     @Override 
     public int getLeadSelectionRow() { 
      return selectionModel.getLeadSelectionRow(); 
     } 

     @Override 
     public TreePath getLeadSelectionPath() { 
      return selectionModel.getLeadSelectionPath(); 
     } 

     @Override 
     public void addPropertyChangeListener(PropertyChangeListener listener) { 
      selectionModel.addPropertyChangeListener(listener); 
     } 

     @Override 
     public void removePropertyChangeListener(PropertyChangeListener listener) { 
      selectionModel.removePropertyChangeListener(listener); 
     } 

     @Override 
     public void addTreeSelectionListener(TreeSelectionListener x) { 
      selectionModel.addTreeSelectionListener(x); 
     } 

     @Override 
     public void removeTreeSelectionListener(TreeSelectionListener x) { 
      selectionModel.removeTreeSelectionListener(x); 
     } 

    } 

    protected void initUI() { 
     final DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
     fillTree(root, 5, "Some tree label"); 
     final DefaultTreeModel model = new DefaultTreeModel(root); 
     JTree tree = new JTree(model); 
     tree.setSelectionModel(new MyTreeSelectionModel()); 
     JFrame f = new JFrame(); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(new JScrollPane(tree)); 
     f.setSize(400, 600); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    private void fillTree(DefaultMutableTreeNode parent, int level, String label) { 
     for (int i = 0; i < 5; i++) { 
      DefaultMutableTreeNode node = new DefaultMutableTreeNode(label + " " + i); 
      parent.add(node); 
      if (level > 0) { 
       fillTree(node, level - 1, label); 
      } 
     } 

    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new TestTreeSelection().initUI(); 
      } 
     }); 
    } 

} 
+0

不錯,,,,,,,,,,,,,, – mKorbel

+0

非常感謝,解決了我的問題!!!非常感謝您的幫助! –

+1

爲什麼委託而不是直接擴展'DefaultTreeSelectionModel'? (少寫代碼) –

相關問題