你好,当晚的编码员, 我陷入道德困境(不是道德困境,但大多数情况下我不知道该怎么做)。 假设我有一个按钮可以执行多个操作,具体取决于所选择的菜单项。 基本上,我已经想象过了
private void menuButtonActionPerformed(ActionEvent b)
ActionEvent a
if(a.getSource()==menuItem)
if(b.getSource()==button)
do this and that
这是正确的方法吗?因为如果是这样,我必须在menuItem上添加ActionListeners,但是我在某些地方会遇到一些愚蠢的错误代码!
预先感谢您的帮助!
Post Scriptum:@David,我已经尝试过了,但是初始条件尚未得到验证。
private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt)
ActionListener l = (ActionEvent e) -> {
if(e.getSource()==menuItemAdd)
{
System.out.println("eureka!");
buttonSearch.setEnabled(false);
if (evt.getSource()==buttonValidate)
{
DataTransac dt = new DataTransac();
dt.addCoders("...");
}
}
if(e.getSource()==itemDelete)
{
DataTransac dt = new DataTransac();
dt.deleteCoders("...");
}
};
menuItemAdd.addActionListener(l);
itemDelete.addActionListener(l);
答案 0 :(得分:0)
那行不通;每次使用该侦听器时,您的侦听器将获得不同的调用-因此事件源将是单个调用的按钮或菜单项。
您需要使用一个存储状态的ActionListener响应菜单项,然后分别处理按钮动作。您可以使用一个侦听器来执行此操作,但我不会;我会这样做:
private MenuItem selected;
private class MenuItemListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
// if you really want to have one listener for multiple menu items,
// continue with the .getSource() strategy above, but store some
// state outside the listener
selected = (MenuItem)event.getSource();
// you could alternatively have a different listener for each item
// that manipulates some state
}
}
private class ButtonListener implements ActionListener {
public void actionPerformed(ActionEvent event) {
// take conditional action based on selected menu item, as you describe
// in the question
}
}
void setup() {
JMenuItem first = /* ... */;
JMenuItem second = /* ... */;
MenuItemListener listener = new MenuItemListener();
first.addActionListener(listener);
second.addActionListener(listener);
JButton button = /* ... */;
button.addActionListener(buttonListener);
}
通常来说,这是首选方法-对每个语义动作使用不同的侦听器,而不是对源进行内省的侦听器。您的代码将更简洁,更容易理解。
出于相同的原因,某些人更喜欢对Java事件侦听器使用匿名类。这是一个要点,其中显示了几种语法:https://gist.github.com/sfcgeorge/83027af0338c7c34adf8。如果您使用Java 8或更高版本,我个人更喜欢:
button.addActionListener( event -> {
// handle the button event
} );