java - Jtree:将背景颜色设置为最大单双击节点

标签 java swing jtree

双击时,我将双击的 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");
                  }
            }


}

}

最佳答案

除了更改节点的状态之外,您还必须将更改通知模型。假设模型的类型为 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);

关于java - Jtree:将背景颜色设置为最大单双击节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8116853/

相关文章:

java - JTree添加节点和更新

java - GUI JButton,如何将按钮(问题)分配给答案

java - 如何在java中获取父面板?

java - 如何拦截Spring拦截器对Node Service的请求

java - 将 T(n) 转换为带底板的 Theta

java - 在 JFrame 上启用 Split View

Java Swing 程序结构

java - 如何让我的 TreeCellRenderer 填充我的 JTree?

java - 如何获取类型 ="xs:date"而不是类型 ="xs:dateTime"

java - 如何针对不同版本的客户端代码进行自动化测试