亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java JTree JCheckBox樹復選框詳解

2024-07-13 10:13:46
字體:
來源:轉載
供稿:網友

本文實例為大家分享了java JTree JCheckBox樹復選框展示的具體代碼,供大家參考,具體內容如下

1.CheckTreeManager.java

public class CheckTreeManager extends MouseAdapter implements TreeSelectionListener {    private CheckTreeSelectionModel selectionModel = null;   // private JTree tree = new JTree();   private JTree tree = null;     int hotspot = new JCheckBox().getPreferredSize().width;     public CheckTreeManager(JTree tree)   {    this.tree = tree;    selectionModel = new CheckTreeSelectionModel(tree.getModel());    tree.setCellRenderer(new CheckTreeCellRenderer(tree.getCellRenderer(), selectionModel));    tree.addMouseListener(this); //鼠標監聽    selectionModel.addTreeSelectionListener(this); //樹選擇監聽   }     public void mouseClicked(MouseEvent me)   {    TreePath path = tree.getPathForLocation(me.getX(), me.getY());    if(path==null)     return;    if(me.getX()>tree.getPathBounds(path).x+hotspot)     return;       boolean selected = selectionModel.isPathSelected(path, true);    selectionModel.removeTreeSelectionListener(this);       try    {     if(selected)      selectionModel.removeSelectionPath(path);     else      selectionModel.addSelectionPath(path);    }    finally    {     selectionModel.addTreeSelectionListener(this);     tree.treeDidChange();    }   }     public CheckTreeSelectionModel getSelectionModel()   {    return selectionModel;   }     public void valueChanged(TreeSelectionEvent e)   {    tree.treeDidChange();   }   } 

2.CheckTreeSelectionModel.java

public class CheckTreeSelectionModel extends DefaultTreeSelectionModel {   private TreeModel model;     public CheckTreeSelectionModel(TreeModel model)   {    this.model = model;    setSelectionMode(TreeSelectionModel.DISCONTIGUOUS_TREE_SELECTION);   }     // tests whether there is any unselected node in the subtree of given path   public boolean isPartiallySelected(TreePath path){    if(isPathSelected(path, true))     return false;    TreePath[] selectionPaths = getSelectionPaths();    if(selectionPaths==null)     return false;    for(int j = 0; j<selectionPaths.length; j++)    {     if(isDescendant(selectionPaths[j], path))      return true;    }    return false;   }     // tells whether given path is selected.   // if dig is true, then a path is assumed to be selected, if   // one of its ancestor is selected.   public boolean isPathSelected(TreePath path, boolean dig)   {    if(!dig)     return super.isPathSelected(path);    while(path!=null && !super.isPathSelected(path))     path = path.getParentPath();    return path!=null;   }     // is path1 descendant of path2   private boolean isDescendant(TreePath path1, TreePath path2)   {    Object obj1[] = path1.getPath();    Object obj2[] = path2.getPath();    for(int i = 0; i<obj2.length; i++)    {     if(obj1[i]!=obj2[i])      return false;    }    return true;   }     public void setSelectionPaths(TreePath[] pPaths)   {    throw new UnsupportedOperationException("not implemented yet!!!");   }     public void addSelectionPaths(TreePath[] paths)   {    // unselect all descendants of paths[]    for(int i = 0; i<paths.length; i++){     TreePath path = paths[i];     TreePath[] selectionPaths = getSelectionPaths();     if(selectionPaths==null)      break;     ArrayList toBeRemoved = new ArrayList();     for(int j = 0; j<selectionPaths.length; j++)     {      if(isDescendant(selectionPaths[j], path))       toBeRemoved.add(selectionPaths[j]);     }     super.removeSelectionPaths((TreePath[])toBeRemoved.toArray(new TreePath[0]));    }       // if all siblings are selected then unselect them and select parent recursively    // otherwize just select that path.    for(int i = 0; i<paths.length; i++)    {     TreePath path = paths[i];     TreePath temp = null;     while(areSiblingsSelected(path))     {      temp = path;      if(path.getParentPath()==null)       break;      path = path.getParentPath();     }     if(temp!=null)     {      if(temp.getParentPath()!=null)       addSelectionPath(temp.getParentPath());      else      {       if(!isSelectionEmpty())        removeSelectionPaths(getSelectionPaths());       super.addSelectionPaths(new TreePath[]{temp});      }     }     else      super.addSelectionPaths(new TreePath[]{ path});    }   }     // tells whether all siblings of given path are selected.   private boolean areSiblingsSelected(TreePath path)   {    TreePath parent = path.getParentPath();    if(parent==null)     return true;    Object node = path.getLastPathComponent();    Object parentNode = parent.getLastPathComponent();       int childCount = model.getChildCount(parentNode);    for(int i = 0; i<childCount; i++)    {     Object childNode = model.getChild(parentNode, i);     if(childNode==node)      continue;     if(!isPathSelected(parent.pathByAddingChild(childNode)))      return false;    }    return true;   }     public void removeSelectionPaths(TreePath[] paths)   {    for(int i = 0; i<paths.length; i++){     TreePath path = paths[i];     if(path.getPathCount()==1)      super.removeSelectionPaths(new TreePath[]{ path});     else      toggleRemoveSelection(path);    }   }     // if any ancestor node of given path is selected then unselect it   // and selection all its descendants except given path and descendants.   // otherwise just unselect the given path   private void toggleRemoveSelection(TreePath path)   {    Stack stack = new Stack();    TreePath parent = path.getParentPath();    while(parent!=null && !isPathSelected(parent))    {     stack.push(parent);     parent = parent.getParentPath();    }    if(parent!=null)     stack.push(parent);    else{     super.removeSelectionPaths(new TreePath[]{path});     return;    }       while(!stack.isEmpty())    {     TreePath temp = (TreePath)stack.pop();     TreePath peekPath = stack.isEmpty() ? path : (TreePath)stack.peek();     Object node = temp.getLastPathComponent();     Object peekNode = peekPath.getLastPathComponent();     int childCount = model.getChildCount(node);     for(int i = 0; i<childCount; i++){      Object childNode = model.getChild(node, i);      if(childNode!=peekNode)       super.addSelectionPaths(new TreePath[]{temp.pathByAddingChild(childNode)});     }    }    super.removeSelectionPaths(new TreePath[]{parent});   }     } 

3.CheckTreeCellRenderer .java

public class CheckTreeCellRenderer extends JPanel implements TreeCellRenderer {  private CheckTreeSelectionModel selectionModel;  private TreeCellRenderer delegate; // private TristateCheckBox checkBox = new TristateCheckBox();  private JCheckBox checkBox = new JCheckBox();   public CheckTreeCellRenderer(TreeCellRenderer delegate, CheckTreeSelectionModel selectionModel){   this.delegate = delegate;   this.selectionModel = selectionModel;   setLayout(new BorderLayout());   setOpaque(false);   checkBox.setOpaque(false);  }    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus){   Component renderer = delegate.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus);    TreePath path = tree.getPathForRow(row);   if(path!=null)   {    System.out.println(path);    if(selectionModel.isPathSelected(path, true))     checkBox.setSelected(true);    else    {     System.out.println(selectionModel.isPartiallySelected(path));     checkBox.setSelected(selectionModel.isPartiallySelected(path) ? true : false);    }   }   removeAll();   add(checkBox, BorderLayout.WEST);   add(renderer, BorderLayout.CENTER);   return this;  } } 

4.用法

CheckTreeManager checkTreeManager = new CheckTreeManager(jTree);  

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产色视频一区| 久久精品成人动漫| 最近2019好看的中文字幕免费| 欧美在线观看日本一区| 亚洲欧美日韩一区二区三区在线| 57pao成人国产永久免费| 欧美有码在线观看| 色哟哟入口国产精品| 欧美午夜丰满在线18影院| 国外成人在线直播| 国产精品wwww| 久久九九精品99国产精品| 日韩最新免费不卡| 这里只有视频精品| 一本色道久久综合亚洲精品小说| 国产精品女视频| 国产91精品久久久久| 在线观看国产欧美| 欧美国产日产韩国视频| 国产精品狼人色视频一区| 欧美色xxxx| 黑人巨大精品欧美一区二区三区| 亚洲视频在线免费观看| 日韩va亚洲va欧洲va国产| 日韩美女免费观看| 欧美日韩成人黄色| 欧美成人一区二区三区电影| 欧美视频第一页| 2020欧美日韩在线视频| 97在线精品视频| 日韩中文理论片| 久久久国产精彩视频美女艺术照福利| 久久综合伊人77777蜜臀| 欧美激情性做爰免费视频| 国产精品久久久久久久久久99| 日韩在线视频网站| 日韩久久免费视频| 青草青草久热精品视频在线观看| 国产精品最新在线观看| 成人有码在线播放| 亚洲精品乱码久久久久久金桔影视| 国产欧美日韩精品丝袜高跟鞋| 日本精品在线视频| 国产成人av在线播放| 日韩欧美aaa| 色爱精品视频一区| 国产日产亚洲精品| 亚洲跨种族黑人xxx| 色综合伊人色综合网| 在线日韩日本国产亚洲| 亚洲色图13p| 亚洲影视九九影院在线观看| 成人亚洲综合色就1024| 久久成人精品一区二区三区| 日韩最新在线视频| 亚洲精品国产精品乱码不99按摩| 午夜美女久久久久爽久久| 亚洲精品98久久久久久中文字幕| 日韩激情av在线免费观看| 亚洲男人天堂古典| 亚洲国产免费av| 亚洲精品自拍偷拍| 亚洲三级免费看| 日韩精品在线免费| 亚洲人成人99网站| 亚洲日本成人女熟在线观看| 中国china体内裑精亚洲片| 日韩成人在线免费观看| 久久天天躁狠狠躁老女人| 亚洲国产欧美一区二区三区同亚洲| 精品久久久久久久久久久久久| 国产精品日韩专区| 国产一区二中文字幕在线看| 久久久久久尹人网香蕉| 欧美成人一区二区三区电影| 亚洲国产精品悠悠久久琪琪| 色小说视频一区| 亚洲 日韩 国产第一| 亚洲女人被黑人巨大进入al| 欧美人成在线视频| 亚洲国产成人91精品| 国产精品一区二区三区毛片淫片| 色哟哟网站入口亚洲精品| 久久久久久久成人| 国产精品中文在线| 国内偷自视频区视频综合| 国产精品久久久一区| 国产精品丝袜久久久久久不卡| 欧洲亚洲免费在线| 国产99视频精品免视看7| 日韩中文字幕视频在线| 国产一级揄自揄精品视频| 中文字幕av一区中文字幕天堂| 亚洲欧美综合v| 亚洲国产日韩一区| 91人人爽人人爽人人精88v| 亚洲激情成人网| 成人免费视频xnxx.com| 国产精品一区二区久久| 欧美日韩综合视频网址| 亚洲免费视频网站| 国产成人精品一区二区在线| 夜夜嗨av色综合久久久综合网| 国产日韩在线视频| 午夜精品一区二区三区在线播放| 91精品国产乱码久久久久久久久| 久久久精品久久久| 国产精品igao视频| 欧美日韩视频在线| 国产一区欧美二区三区| 久久天天躁狠狠躁夜夜爽蜜月| 激情成人在线视频| 国产成人精品一区二区| 欧美刺激性大交免费视频| 亚洲成人久久久久| 日韩美女免费线视频| 成人免费看片视频| 亚洲自拍高清视频网站| 亚洲色图色老头| 欧美日本在线视频中文字字幕| 午夜精品一区二区三区av| 久久久久久久国产| 欧美一性一乱一交一视频| 亚洲无限av看| 亚洲色图五月天| 日韩欧美综合在线视频| 日韩欧美精品在线观看| 国产精品成久久久久三级| 国自产精品手机在线观看视频| 国产成人91久久精品| 精品中文字幕乱| 色综合视频一区中文字幕| 成人国产在线视频| 亚洲精品久久久久中文字幕欢迎你| 91九色国产社区在线观看| 欧美午夜电影在线| 精品日韩视频在线观看| 777午夜精品福利在线观看| 国产色视频一区| 欧美亚洲视频在线看网址| 日韩视频在线免费| 亚洲精品久久久久久久久久久久久| 国产91精品不卡视频| 亚洲成成品网站| 国产精品视频免费观看www| 亚洲最新av在线| 久久精品精品电影网| 久久99精品视频一区97| 欧美成在线视频| 国产97在线观看| 91色视频在线观看| 色综合导航网站| 久久成人一区二区| 日韩中文字幕在线看| 亚洲精品欧美日韩| 亚洲欧美国产精品专区久久| 国产美女精品免费电影| 亚洲一区二区少妇| 美女扒开尿口让男人操亚洲视频网站| 97精品一区二区三区| 国内精品一区二区三区四区| 亚洲在线观看视频网站| 久久91超碰青草是什么| 国产成人拍精品视频午夜网站|