Jtree: установить backgroundColor для максимального узла с одним двойным щелчком - PullRequest
0 голосов
/ 14 ноября 2011

При двойном щелчке я выделяю фон узла двойного щелчка Jtree в зеленый. Когда я дважды щелкаю по другим узлам, ранее выбранный зеленый узел должен быть восстановлен до его исходного состояния, а недавно дважды щелкнувший узел должен загореться зеленым.

Это работает несколько, но ведет себя непоследовательно. Когда я дважды щелкаю дочерние узлы, они становятся зелеными, а предыдущий узел с двойным щелчком остается зеленым, пока я не выберу этот узел и не выберу другой узел ....

вот мой пользовательский рендер.

 public class MyRenderer extends DefaultTreeCellRenderer{


        public MyRenderer() {
        }

    public Component getTreeCellRendererComponent(
                        JTree tree,
                        Object value,
                        boolean sel,
                        boolean expanded,
                        boolean leaf,
                        int row,
                        boolean hasFocus) {

        super.getTreeCellRendererComponent(
                        tree, value, sel,
                        expanded, leaf, row,
                        hasFocus);

        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
        NodePro np = (NodePro)(node.getUserObject());

        if(np.getNodeancestors() != null){
            if(np.getNodeancestors().contains("activated")){
                setBackgroundNonSelectionColor(Color.GREEN);

            }else{
                setBackgroundNonSelectionColor(null);

            }
        }else{
            setBackgroundNonSelectionColor(null);

        }

        return this;
    }


}

Вот мой Jtree, который добавляет слушателя двойного щелчка.

  public class Tree extends JTree{
        private static Tree INSTANCE;
        private TreeSelectionListenerClass tsl;
        private TreePopupTriggerListener ptl;
        private TreeDoubleClickListener dbll;

        public Tree() {
            // TODO Auto-generated constructor stub

                tsl = new TreeSelectionListenerClass();
                dbll = new TreeDoubleClickListener();

        addTreeSelectionListener(tsl);
        addMouseListener(dbll);
        setToggleClickCount(0);
        setCellRenderer(new MyRenderer());

    }

вот где я ловлю двойной щелчок ....

public class TreeDoubleClickListener implements MouseInputListener {

    public TreeDoubleClickListener(){

    }

    /*On Double Click (This Node Will Be Activated), Save To Activated Node */
    @Override
    public void mouseClicked(MouseEvent e) {

        if (e.getClickCount() == 2){            
            Global.showWaitCursor();

            try{
                DefaultMutableTreeNode selected = (DefaultMutableTreeNode) Global.previousTreePath.getLastPathComponent();
                NodePro npx = (NodePro) selected.getUserObject();
                npx.setNodeancestors("");

                 TreePath path = Tree.getInstance().getPathForLocation(e.getX(), e.getY());
                  if (path != null){                  
                      Global.previousTreePath = path;
                      DefaultMutableTreeNode current = (DefaultMutableTreeNode) Global.previousTreePath.getLastPathComponent();
                      NodePro npt = (NodePro) current.getUserObject();
                      npt.setNodeancestors("activated");
                  }

            }catch(Exception zxcv){
                //save this path to edit later
                  TreePath path = Tree.getInstance().getPathForLocation(e.getX(), e.getY());
                  if (path != null){                  
                      Global.previousTreePath = path;
                      DefaultMutableTreeNode current = (DefaultMutableTreeNode) Global.previousTreePath.getLastPathComponent();
                      NodePro npt = (NodePro) current.getUserObject();
                      npt.setNodeancestors("activated");
                  }
            }


}

}

1 Ответ

2 голосов
/ 14 ноября 2011

Помимо изменения состояния узла, вы должны уведомить модель об изменении. Предполагая, что модель имеет тип DefaultTreeModel (в случае с пользовательской моделью вам нужно будет сообщить соответствующие методы)

 // change node/user object
 DefaultMutableTreeNode current = (DefaultMutableTreeNode) 
          Global.previousTreePath.getLastPathComponent();
 NodePro npt = (NodePro) current.getUserObject();
 npt.setNodeancestors("activated");
 // notify model
 JTree tree = (JTree) e.getSource();
 ((DefaultTreeModel) tree.getModel()).nodeChanged(current);
...