0

我已经实现了一个JTree使用DefaultTreeModel。我将消息类型对象存储在树中,我最初根据direction消息的变量值设置节点图标。我可以使用下面的代码成功地做到这一点。

    tcBuilderTree = new JTree(treeModel);
tcBuilderTree.getSelectionModel().setSelectionMode
(TreeSelectionModel.SINGLE_TREE_SELECTION);

tcBuilderTree.setCellRenderer(new DefaultTreeCellRenderer(){

        public Component getTreeCellRendererComponent(JTree tree,
                                                      Object value, 
                                                      boolean selected, 
                                                      boolean expanded,
                                                      boolean isLeaf, 
                                                      int row, 
                                                      boolean focused) {
            Component c = super.getTreeCellRendererComponent(tree, value,
                    selected, expanded, isLeaf, row, focused);

            if(value instanceof CustomMessageTreeNode){
                setIcon(((CustomMessageTreeNode)value).
                getMessage().getMessageDirectionIcon());
            }

            return c;
        }
    });


    //implementation of getMessageDirectionIcon()
    public ImageIcon getMessageDirectionIcon(){
        ImageIcon icon=null;
        URL messageIconUrl;

        if(msgDirection.equalsIgnoreCase("In")){
            messageIconUrl = ToolBar.class.getResource
            ("/icons/arrowRight.png");
            icon=new ImageIcon(messageIconUrl);
        }
        else if(msgDirection.equalsIgnoreCase("Out")){
            messageIconUrl = ToolBar.class.getResource
            ("/icons/arrowLeft.png");
            icon=new ImageIcon(messageIconUrl);
        }
        return icon;
    }

动态地,我想让用户选择节点并更改其方向,以便更改节点图标。我正在通过以下代码进行操作。

    public void toggleDirection(){
    CustomMessageTreeNode currentSelectedNode = 
        (CustomMessageTreeNode) tcBuilderTree.getLastSelectedPathComponent();
    Message toggleMessage=currentSelectedNode.getMessage();

    tcBuilderTree.setCellRenderer(new DefaultTreeCellRenderer(){
        @Override
        public Component getTreeCellRendererComponent(JTree tree,
                                                      Object value, 
                                                      boolean selected, 
                                                      boolean expanded,
                                                      boolean isLeaf, 
                                                      int row, 
                                                      boolean focused) {
            Component c = super.getTreeCellRendererComponent(tree, value,
                    selected, expanded, isLeaf, row, focused);

            if(value instanceof CustomMessageTreeNode){
                String currentDirection=toggleMessage.getMsgDirection();

                if(currentDirection.equalsIgnoreCase("In")){
                    toggleMessage.setMsgDirection("Out");
                    System.out.println("Direction changed as : Out");
                    setIcon(toggleMessage.getMessageDirectionIcon());
                    return c;
                }
                if(currentDirection.equalsIgnoreCase("Out")){
                    toggleMessage.setMsgDirection("In");
                    System.out.println("Direction changed as : In");
                    setIcon(toggleMessage.getMessageDirectionIcon());
                    return c;

                }
            }
            return c;
        }
    });
}

这是我的CustomMessageNode课。

public class CustomMessageTreeNode extends DefaultMutableTreeNode{
    private Message message;

    public CustomMessageTreeNode(String msgName){
        super(msgName);
    }   
    public Message getMessage() {
        return message;
    }    
    public void setMessage(Message message) {
        this.message = message;
    }   
}

一旦我通过选择节点改变方向,图标就会改变。但是,每当我单击其他节点或 JFrame 中的某个位置时,就会出现问题,该图标会不断改变方向。我调试并确保toggleDirection() 当我单击节点并说改变方向时该函数只被调用一次。

请让我知道为什么会发生这种情况,是否有更好的方法来做到这一点。当用户更改一次节点图标时,节点图标不断变化的原因是什么。

4

0 回答 0