代码之家  ›  专栏  ›  技术社区  ›  tinyhamster

Java中的事件处理(JTree+JButton)

  •  0
  • tinyhamster  · 技术社区  · 9 年前
    private void createEvents() 
    {
        menuFileExit.addActionListener(new ActionListener() 
        {
            public void actionPerformed(ActionEvent arg0) 
            {
                System.exit(0);
            }
        });
        ////// Events on tree selection
        jtStoryViewer.addTreeSelectionListener(new TreeSelectionListener() 
        {
            public void valueChanged(TreeSelectionEvent arg0) 
            {
                DefaultMutableTreeNode selection = (DefaultMutableTreeNode) jtStoryViewer.getLastSelectedPathComponent();
                Object nodeObject = selection.getUserObject();
    
    
    
                ////// Checks if selected node is a String (only story title is a string)
                if(selection.getUserObject().getClass().getName() == "java.lang.String" )
                {
                    tfTitle.setText(nodeObject.toString());
    
    
                    ////// Action listener for Change Button
                    btnChange.addActionListener(new ActionListener() 
                    {
                        ////// Title text swap
                        public void actionPerformed(ActionEvent arg0) 
                        {
                            selection.setUserObject(tfTitle.getText());
                            ((DefaultTreeModel)jtStoryViewer.getModel()).nodeChanged(selection);
                        }
                    });
                }
                ///// checks if the object is a chapter object
                if(selection.getUserObject().getClass().getName() == "ISW.common.Chapter")
                {
                    Chapter chapter = (Chapter) selection.getUserObject();
                    tfTitle.setText(chapter.toString());
    
    
    
                    ////// Action listener for Change Button
                    btnChange.addActionListener(new ActionListener() 
                    {
                        ////// Title text swap
                        public void actionPerformed(ActionEvent arg0) 
                        {
                            chapter.setTitle(tfTitle.getText());
                            ((DefaultTreeModel)jtStoryViewer.getModel()).nodeChanged(selection);
    
                        }
                    });
                }
    
    
            }
        }); 
    }
    

    visualization of the problem

    我正在使用 JTree 以显示和修改某些对象。我添加了一个 TreeSelectionListener 以在选择时获取对象数据。现在,我想能够更改对象的标题,它在树上第一次选择时很好,我更改了文本框中的值,“更改”按钮也很好,但当我移动到下一个对象时,更改按钮也会修改所有先前选择的对象的值。

    我想这是由于我对ActionListeners的不当使用造成的,但我不能确定,在这一点上我被卡住了。

    如有任何提示,将不胜感激。

    1 回复  |  直到 9 年前
        1
  •  2
  •   MadProgrammer    9 年前

    不要继续添加 ActionListener btnChange JButton TreeSelectionListener#valueChanged 方法

    这将导致按钮调用EVERY 监听器 你以前有过

    相反,给出 btn更改 单曲 监听器 单击时,可以对当前选定的节点进行操作(通过选中 JTree 它自己)。你可以拥有 TreeSelectionListener#值已更改 方法启用或禁用 btn更改 基于选择的有效性

    而且 if(selection.getUserObject().getClass().getName() == "ISW.common.Chapter") 不是这样的 String 比较是在Java中完成的,相反,您应该使用类似 if("ISW.common.Chapter".equals(selection.getUserObject().getClass().getName()))