我正在使用一个ActionListener,并且还有很多if语句,以便知道按下哪个按钮并根据按钮运行一些代码。
有没有办法让代码更好?我有近10个其他if语句互相跟随,还有其他我可以用的东西吗?
代码示例:
class BtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == menu.getOpen()) {
getFile();
} else if (e.getSource() == btnPlay) {
} else if (e.getSource() == btnQuit)) {
}
}
感谢。
答案 0 :(得分:1)
您可以使用按钮的操作命令和开关盒块:
public void actionPerformed(ActionEvent e){
switch(e.getActionCommand()) {
case "Open":
open();
break;
case "Delete":
delete();
break;
default :
break;
}
}
当然,您必须先设置每个按钮的动作命令,例如:
openButton.setActionCommand("Open");
请注意,只有{em> JDK 7 :Strings in switch Statements
才会出现带有String
个对象的开关案例
答案 1 :(得分:1)
您可以在使用侦听器之前填充Map<Object, Consumer<ActionEvent>>
,例如在构造函数中,其中key为source
,value为action事件的使用者。在操作中,按键获取消费者并调用它。
class BtnListener implements ActionListener {
Map<Object, Consumer<ActionEvent>> eventsMap = new HashMap<>();
public BtnListener() {
eventsMap.put(menu.getOpen(), actionEvent -> this.getFile());
eventsMap.put(btnPlay, actionEvent -> { //do something
});
eventsMap.put(btnQuit, actionEvent -> { //do something else
});
}
@Override
public void actionPerformed(ActionEvent e) {
Optional.of(e)
.map(ActionEvent::getSource)
.map(eventsMap::get)
.ifPresent(
actionEventConsumer -> actionEventConsumer.accept(e)
);
}
}
答案 2 :(得分:0)
如果是梯形图,你可以转换语句而不是其他很多。
class BtnListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
if (e.getSource() == menu.getOpen()) {
getFile();
}
switch( e.getSource() ){
case btnPlay:
break;
case btnQuit:
break;
default:
}
}
}
答案 3 :(得分:0)
避免所有“开销”的最佳方法是Lambda-Expressioned按钮。例如:
JButton b1 = new JButton("Play");
b1.addActionListener(e -> play());
...
JButton bn = new JButton("Stop");
bn.addActionListener(e -> stop());
...
private void play() {
....// playing codes
}
...
private void stop() {
...// stopping codes
}
...