我正在制作java JFrame中的菜单。我已经看到了两种对同一班级中不同事件做出不同反应的方法。一种是使用几年前这个答案中描述的匿名内部类: https://stackoverflow.com/a/10472395/5960074
public static void createMenuBar()
{
//Main Menu Items
menubar.add(fileMenu);
MainWindow.window.setJMenuBar(menubar);
//Sub menu items
saveItem = new JMenuItem("Save");
loadItem = new JMenuItem("Load");
//Add to the "File" menu item
fileMenu.add(saveItem);
fileMenu.add(loadItem);
//Anonymous Inner classes for actionListeners
//Action event for saving
saveItem.addActionListener(new ActionListener(){ //adding the listener
@Override
public void actionPerformed(ActionEvent e){ //creating the specific action for save
System.out.println("You tried to save.");
}
});
}
在我的代码中它看起来像这样并且它可以工作(就像此时它打印"你试图保存。"到控制台)。
我已经看到其他人在类中实现ActionListener,然后在方法actionPerformed()中使用if语句来跟踪事件的来源。所以有一个事件,但代码会改变触发它的内容。
第一种方法看起来很乱,第二种方法更容易阅读。是否有理由在第二种方法中使用第一种方法?
感谢。
答案 0 :(得分:1)
将Action类与非匿名类一起使用(但它们可以是静态内部类)。它为您提供了良好的封装,使代码可读,并且在许多方面比使用ActionListener
更好。
答案 1 :(得分:1)
首先,避免使用static
,你真的(真的)不需要它,它会促进糟糕的代码设计。
假设您使用Java 8,因此可以使用lambda:
public void createMenuBar() {
...
saveItem.addActionListener(this::save);
loadItem.addActionListener(this::load);
}
private save(ActionEvent e) {
....
}
private load(ActionEvent e) {
....
}
如果你不能使用内部类的lambdas比实现接口和使用if
语句更好。
public class MyGui {
private class SaveAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
....
}
}
private class LoadAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
....
}
}
public void createMenuBar() {
...
saveItem.addActionListener(new SaveAction());
loadItem.addActionListener(new LoadAction());
}
}