1

我将脱离我在教科书中看到的内容,为按钮制作一个动作监听器。为此,我创建了一个内部类。当我尝试调用内部类时,出现错误:找不到符号。

这是代码:

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 放入参数中,但这对我也不起作用。不确定是不是因为我在一个子类中工作。也不确定是否需要以不同的方式完成事情,因为我正在使用界面。

4

4 回答 4

1

放置WithdrawListener在构造函数上下文的外部

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.");
        }
    }
于 2015-04-03T04:30:11.867 回答
0

在本地类声明后向按钮添加侦听器。

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

    class PQR {

    }   
}

正确的方法是

public void abc(){
    class PQR {

    }
    PQR pqr = new PQR(); //correct
}
于 2015-04-03T04:30:01.937 回答
0

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

这个没有显示错误:

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

但是这个可以:

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

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

于 2015-04-03T04:30:58.197 回答
0

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

看看它(经常与听众一起使用) - 这是一个很好的答案! 从上面的链接引用

使用这种方法可以使编码更快一点,因为我不需要创建一个实现 ActionListener 的额外类——我可以只实例化一个匿名内部类,而无需实际创建一个单独的类。

我只将这种技术用于“快速而肮脏”的任务,让整个班级感觉没有必要。拥有多个做同样事情的匿名内部类应该重构为一个实际的类,无论是内部类还是单独的类。

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);
于 2015-04-03T04:38:37.167 回答