Динамическое изменение значка узла JTree

Я реализовал 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() Функция вызывается только один раз, когда я нажимаю на узел и говорю, чтобы изменить направление.

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

0 ответов

Другие вопросы по тегам