Java 匿名类变为内部类

Java 匿名类变为内部类,java,Java,我被要求将一个匿名按钮类转换为一个内部按钮类。我要阅读的文本使用包含ActonListener的示例讨论了这个主题。但是,我要修改的代码中没有ActonListener。所以我很难按照我应该做的去做。如何获取以下代码并将匿名类转换为内部类。我的按钮代码中有匿名类吗 警告:不要只是给我打一个答案。我需要学习这个。请帮我指出正确的方向 这是我的密码: package ui.panels; import java.awt.Panel; import interfaces.Resettable; i

我被要求将一个匿名按钮类转换为一个内部按钮类。我要阅读的文本使用包含
ActonListener
的示例讨论了这个主题。但是,我要修改的代码中没有
ActonListener
。所以我很难按照我应该做的去做。如何获取以下代码并将匿名类转换为内部类。我的按钮代码中有匿名类吗

警告:不要只是给我打一个答案。我需要学习这个。请帮我指出正确的方向

这是我的密码:

package ui.panels;

import java.awt.Panel;

import interfaces.Resettable;
import model.Model;
import ui.panels.ButtonPanel;

public class ControlsPanel extends Panel implements Resettable{  
    private ButtonPanel btnPanel;

    public ControlsPanel (Model model) {
        btnPanel = new ButtonPanel(model);
        add(btnPanel);
    }

    public void resetComponents() {
    }
}
这里是“ButtonPanel.java”


事实上,那里没有匿名类。您可以想象转换以另一种方式运行,例如新的resetable()..

--在问题更新时编辑---

包含从
ActionListener

你需要这些代码来读像这样的东西

btnClear.addActionListener(new MyInnerClass());
如果你这样做,所有的工作都100%相同,我会说你做到了

---原文如下--- 这个问题的措辞使我可以理解它;但是,我不确定

一个提示是它要求一个内部类。这意味着解决方案希望您编写一个内部类:

public class ControlsPanel extends Panel implements Resettable {

    // must have an inner class
    class SomeButtonModel (or SomeButtonPanel) {
       // code for inner class.
    }

}
请注意,如果通过在初始值设定项块中指定缺少的函数在代码中实例化了一个抽象类(或接口),则可能找到了“匿名”类。这意味着您的内部类应该扩展该特定类,并且您应该重新处理问题,以使用内部类而不是匿名构造


像往常一样,主要的问题是最初理解所问的问题,一旦理解完毕,剩下的就是工作。

按钮不是匿名的,但动作监听器是匿名的。具体而言:

btnClear.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent arg0) {
        model.resetComponents();
        model.repaint();
    }
});
在这里,您正在调用方法
addActionListener
,并将
ActionListener
的一个实现作为参数传递。这里的关键是这个实现是一个匿名类,它实现了内联接口


记住,
ActionListener
是一个接口,接口不能包含实际的实现。相反,正在发生的是,正在声明一个新类(没有名称),该类实现了
ActionListener
。该接口定义了一个方法,
actionPerformed
,它是按钮的实际处理程序——它调用
resetComponents
repaint
。通过实现
actionPerformed
,可以将其转换为一个新的普通类,该类实际上有一个名称,继续实现
ActionListener
,就我看来,按钮面板是非标准的,因此没有进一步的信息,每个答案都很难回答,但我可以给出一些默认答案;-)

“我的按钮代码中有匿名类吗?” 不,没有。如果要创建实现特定接口的类的实例,通常会创建匿名类

一个非GUI示例是Comparator。您希望根据特定的条件比较数组—您可以为此创建一个额外的类,但无论如何只使用一次,并且没有真正的可重用性。因此,我们将创建一个实现Comparator接口的匿名类:

    Comparator<Integer> c = new Comparator<Integer>() {
        @Override
        public int compare(Integer o1, Integer o2) {
            return o1 - o2;
        }
    };
比较器c=新比较器(){ @凌驾 公共整数比较(整数o1,整数o2){ 返回o1-o2; } };
这没什么特别的-请注意,匿名类可以访问外部变量,但它们在创建对象时会被复制。为了避免混淆,这意味着局部变量必须是最终的。

啊哈!我认为匿名类实际上在“ButtonPanel.java”argh中!我花了几个小时看错了文件

使用匿名类的一个例子是“动态地”实现ActionListener接口,也就是说,不定义单独的类(即具有名称的类,因此不是匿名的类)。例如:

JButton jb = new JButton("click me");
jb.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          // do stuff
     }
});
“new ActionListener()”类是匿名的,因为它没有名称

要将ActionListener创建为外部类(称为OuterClass)中的内部类,可以这样说:

public class OuterClass {
    public OuterClass() {
        JButton jb = new JButton("click me");
        jb.addActionListener(new MyActionListener());
    }

    private class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          // do stuff
        }
    } // end inner class

} // end outer class
现在,您有了一个命名的内部类,即“MyActionListener”,而不是匿名类

希望有帮助


-Ed

什么是
按钮面板
?这似乎是不标准的,这将使提供建议变得棘手。(大概它包含了实际的按钮,但没有看到它的外观,不知道你应该做什么。)此外,在你提供的代码中,似乎没有使用任何内部类,匿名或其他。问你的老师匿名类在哪里啊哈!我认为匿名类实际上在“ButtonPanel.java”argh中!我花了几个小时看错了文件!我说得对吗?如果我等待老师的回应,那将是两天后。是的,是新的ActionListener(){…}。我想你已经自己解决了这个问题,所以你最好在下面发布你自己的答案——谢谢。。。。最后一个挑战是,一旦这个匿名类被提升为一个内部类,它将如何了解
model
JButton jb = new JButton("click me");
jb.addActionListener(new ActionListener() {
     public void actionPerformed(ActionEvent e) {
          // do stuff
     }
});
public class OuterClass {
    public OuterClass() {
        JButton jb = new JButton("click me");
        jb.addActionListener(new MyActionListener());
    }

    private class MyActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
          // do stuff
        }
    } // end inner class

} // end outer class