Java-找不到实现ActionListener的内部类的符号

Java-找不到实现ActionListener的内部类的符号,java,inner-classes,cannot-find-symbol,Java,Inner Classes,Cannot Find Symbol,我要用课本上看到的方法制作一个按钮的动作监听器。为此,我创建了一个内部类。当我尝试调用内部类时,出现了错误:找不到符号 代码如下: package GUI; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ATMGUI extends GUI { public ATMGUI() { this.makePane(); this.makeButto

我要用课本上看到的方法制作一个按钮的动作监听器。为此,我创建了一个内部类。当我尝试调用内部类时,出现了错误:找不到符号

代码如下:

package GUI;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ATMGUI extends GUI
{

    public ATMGUI()
    {

    this.makePane();
      this.makeButton("Withdraw");
        button.addActionListener(new WithdrawListener());
        pane.add(button);
      this.makeText("Enter amount to withdraw: ");
        pane.add(text);
      this.makeTextField("Enter amount here");
        pane.add(field);
    this.makeFrame();
    frame.add(pane);

    class WithdrawListener implements ActionListener
    {
        public void actionPerformed(ActionEvent click)
        {
        System.out.println("This is a test.");
        }
    }
    }
//------------------------------------------------------------------
    public void makeFrame()
    {
    frame = new JFrame();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(500, 500);
      frame.setVisible(true);
    }

    public void makePane()
    {
    pane = new JPanel();
      pane.setLayout(new GridLayout(3,3));
      pane.setVisible(true);
    }

    public void makeButton(String buttonName)
    {
    button = new JButton(buttonName);
    }

    public void makeText(String addText)
    {
    text = new JLabel(addText);
    }

    public void makeTextField(String addText)
    {
    field = new JTextField(addText);
    }
}
这正是给我带来麻烦的地方

button.addActionListener(new WithdrawListener());
我在其他地方看到它必须以某种方式实例化。 我试过这样的方法:

    ATMGUI a = new ATMGUI();
    ATMGUI.WithdrawListener w = a.new WithdrawListener();
然后把w加入到辩论中,但这对我也不起作用。
不确定是不是因为我在一个子类中工作。也不确定是否需要做不同的事情,因为我使用的是一个接口

在本地类声明后将侦听器添加到按钮

public void abc(){
    PQR pqr = new PQR(); // incorrect

    class PQR {

    }   
}
正确的方法是

public void abc(){
    class PQR {

    }
    PQR pqr = new PQR(); //correct
}

监听器
置于构造函数上下文之外

public class ATMGUI extends GUI {

    public ATMGUI() {
        //...
        button.addActionListener(new WithdrawListener());  
        //...
    }

    class WithdrawListener implements ActionListener {

        public void actionPerformed(ActionEvent click) {
            System.out.println("This is a test.");
        }
    }

似乎在使用本地类之前必须先声明它。我测试了以下代码片段:

这一个没有显示错误:

public void testFunc() {
    class Test {
    }
    Test test = new Test();
}
但这一个是:

public void testFunc() {
    Test test = new Test();
    class Test {
    }
}

编辑:很抱歉几乎同时发布,下次我将检查三次是否有人已经发布。

当您不重用类时,建议使用匿名类型

看看它()-这是一个很好的答案!! 引自上述链接

使用这种方法可以加快编码速度,因为我不需要 要创建一个实现ActionListener的额外类,我可以 实例化匿名内部类,而不实际创建 单独上课

我只在“又快又脏”的任务中使用这种技术,其中 全班同学都觉得没必要。具有多个匿名内部 执行完全相同操作的类应重构为 实际类,无论是内部类还是单独的类


Oops,并不是要包含代码段框。请忽略这一点。尝试将内部类放在
ATMGUI
构造函数之外,或者编写一个匿名内部类!!也许OP希望类是本地的而不是嵌套的?@AniketThakur根据OP的尝试和对“内部类”的引用,这是我对他们目标的最好猜测。虽然这只是我的观点,但如果它只在一个地方使用,它也很容易阅读。IMO匿名类会更好。将内部类放在构造函数之外是可行的!我现在明白为什么那不起作用了。(如果你没有猜到的话,这对我来说是相当新鲜的,哈哈)虽然这个特定的监听器确实不会被重用,但会有其他监听器被重用。所以,这个方法最符合我想要的。不过,匿名课程也很有帮助。很高兴它有帮助。你可能会考虑对其他有用的答案进行投票(灰色箭头),请不要重复相同的答案。“显然,两个按钮没有相同的动作”-哦,我不知道,一个<代码> JMunuItIs>代码(这是一个按钮类型)和<代码> JButton < /代码>(作为一个标准按钮和/或一个工具栏按钮)可能会分享同一个听众,就个人而言,我会选择一个
动作
,但那只是我自己。有趣。这是我第一次看到匿名类型。这看起来简单多了。谢谢@ArdjenLane看一看,以便更好地理解
this.makePane();
      this.makeButton("Withdraw");
        button.addActionListener(new ActionListener() { //starts here

            public void actionPerformed(ActionEvent click)
            {
            System.out.println("This is a test.");
            }
        });//ends
        pane.add(button);
      this.makeText("Enter amount to withdraw: ");
        pane.add(text);
      this.makeTextField("Enter amount here");
        pane.add(field);
    this.makeFrame();
    frame.add(pane);