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

Event handling in Java (JTree + JButton)

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);

                    }
                });
            }


        }
    }); 
}

我正在使用 JTree 来显示和修改一些 object。我添加了一个 TreeSelectionListener 来获取有关选择的 object 数据。现在我希望能够更改 object 的标题,它在树上的第一次选择时工作正常,我更改文本框中的值并且 "Change" 按钮工作正常,但是当我转到下一个 objects 时,更改按钮还会修改所有先前选择的 objects.

的值

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

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

不要在 TreeSelectionListener#valueChanged 方法中向 btnChange JButton 添加 ActionListener

这将导致按钮调用您之前ActionListener

相反,给 btnChange 一个单独的 ActionListener,当点击时,可以作用于当前选择的节点(通过检查 JTree 它自己)。您可以让 TreeSelectionListener#valueChanged 方法根据选择

的有效性启用或禁用 [​​=11=]

另外,if(selection.getUserObject().getClass().getName() == "ISW.common.Chapter") 不是 String 在 Java 中进行比较的方式,相反你应该使用更像 if("ISW.common.Chapter".equals(selection.getUserObject().getClass().getName()))

的东西