ActionListener原理

ActionListener principles

我正在尝试寻找向 JButton 或其他组件添加操作的基本原则。这是我正在做的和我得到的。

我创建了一个名为 : Ali 的 class,其中有一个 main 方法,在 main 方法中实例化另一个名为:MainFrame 的方法,无论我有什么组件,我都放在这里。

我在这里创建了一个简单的按钮,用 ActionListener 接口注册了它,并为此编写了一个 actionPerformed() 方法。非常简单和容易。但是,不知何故这个程序给我一个错误。 这是简化的代码和错误。

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class Ali{

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable(){
            public void run() {
                JFrame frame = new MainFrameAli2("MainFrameAli2");
                frame.setSize(400,600);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                frame.setVisible(true);
            }
        });
    }
}

这里是 MainFrameAli2 class

public class MainFrameAli2 extends JFrame implements ActionListener {

    public MainFrameAli2(String title){
        super(title);

        // set layout manager
        setLayout(new BorderLayout());

        // create swing component
        JTextArea textArea = new JTextArea();
        JButton button = new JButton("click");

        // add swing components to content pane
        Container c  = getContentPane();
        c.add(textArea, BorderLayout.NORTH);
        c.add(button, BorderLayout.SOUTH);

        // add behavior
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent arg0) {
                System.out.println("Clicked");
            }
            });
    }
}

现在的问题是代码不是 运行,这里是错误:

Exception in thread "AWT-EventQueue-0" java.lang.Error: Unresolved compilation problems: 
    The public type MainFrameAli2 must be defined in its own file
    The type MainFrameAli2 must implement the inherited abstract method ActionListener.actionPerformed(ActionEvent)

而且,如果我编写如下代码,一切正常。

        // add behavior
    button.addActionListener(this);
}

public void actionPerformed(ActionEvent e)  {
    System.out.println("hooyt");
}
}

为什么在第一种情况下不工作而在第二种情况下工作?

so, why it is not working in the first case and working in second case.?

正如编译器消息所说,在第一个示例中,您没有在 MainFrameAli2 class 中实现 ActionListener 接口。

您创建了一个实现 ActionListener 接口的匿名内部 class。这与让 class 实现接口不同。

在第二个示例中,您的 class 确实实现了 ActionListener。

如果您可以完成第一个示例:

//public class MainFrameAli2 extends JFrame implements ActionListener {
public class MainFrameAli2 extends JFrame {