ahe*_*rtz 11 java swing actionlistener
创建实现ActionListener的嵌套类是否有任何好处或缺点:
public class Foo{
Foo(){
something.addActionListener(new ButtonListener());
}
//...
private class ButtonListener implements ActionListener{
public void actionPerformed(ActionEvent e){
//...
}
}
}
Run Code Online (Sandbox Code Playgroud)
与在主类本身中实现ActionListener相比:
public class Foo implements ActionListener{
Foo(){
something.addActionListener(this);
}
//...
public void actionPerformed(ActionEvent e){
//...
}
}
Run Code Online (Sandbox Code Playgroud)
我经常看到这两个例子,只是想知道是否有"最佳实践".
Hov*_*els 10
@Ankur,您仍然可以使用匿名内部类作为您的侦听器,并拥有一个独立的独立控件类,因此具有相当可维护的代码,这是一种我喜欢使用的技术.例如:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AnonymousInnerEg {
private static void createAndShowUI() {
GuiPanel guiPanel = new GuiPanel();
GuiControl guiControl = new GuiControl();
guiPanel.setGuiControl(guiControl);
JFrame frame = new JFrame("AnonymousInnerEg");
frame.getContentPane().add(guiPanel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
class GuiPanel extends JPanel {
private GuiControl control;
public GuiPanel() {
JButton startButton = new JButton("Start");
startButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.startButtonActionPerformed(e);
}
}
});
JButton endButton = new JButton("End");
endButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (control != null) {
control.endButtonActionPerformed(e);
}
}
});
add(startButton);
add(endButton);
}
public void setGuiControl(GuiControl control) {
this.control = control;
}
}
class GuiControl {
public void startButtonActionPerformed(ActionEvent ae) {
System.out.println("start button pushed");
}
public void endButtonActionPerformed(ActionEvent ae) {
System.out.println("end button pushed");
}
}
Run Code Online (Sandbox Code Playgroud)
我认为第一种方法更好,因为您的类将有一个单独的代码来处理操作.并且通常组合也比继承更好,所以只有当一个类真正是一个超类型时,它才应该扩展一个类或实现一个接口.
同样为了可维护性,让我们说Foo类有一个新的要求,即侦听另一种不同类型的事件,然后执行操作,在这种情况下,也可以轻松修改第一类.
如果我不担心可维护性,我宁愿去匿名课堂.
如果 Foo 类除了封装这个按钮之外没有其他责任,那么第一个解决方案就可以了。
然而,一旦 Foo 得到更多它必须听的“东西”,它就会变得混乱。我更喜欢第二种解决方案,因为它更明确并且具有更好的可扩展性。
更好的解决方案可能是创建一个匿名内部类。
public class Foo{
Foo(){
something.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e){
//...
}
});
}
}
Run Code Online (Sandbox Code Playgroud)