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()))
的东西
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
方法根据选择
另外,if(selection.getUserObject().getClass().getName() == "ISW.common.Chapter")
不是 String
在 Java 中进行比较的方式,相反你应该使用更像 if("ISW.common.Chapter".equals(selection.getUserObject().getClass().getName()))