首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java内部类的用法和实例化

Java内部类的用法和实例化
EN

Stack Overflow用户
提问于 2012-11-17 00:03:26
回答 6查看 901关注 0票数 9

前段时间,我用Java写了一个小的图像查看器/处理程序,如果你愿意的话,这是一个迷你Photoshop。

我想要有一个下拉菜单,在那里我可以选择我打开的图像中的哪一个将“放在桌子上”,即。所示和应用于的方法。我希望图像的名称是菜单中显示的JMenuItem的名称。我还想在添加新图像时出现一个新按钮。

我想知道这一点有一段时间了,最后产生了这个解决方案,一个新的类,当添加图像时处理新按钮的创建。代码如下:

代码语言:javascript
复制
import java.awt.event.*;
import javax.swing.*;
import java.util.*;


public class ImageList{

    private ArrayList<JMenuItem> list;
    private ImageHandler main;
    private ImageLevel img;

    public ImageList() {}

    public void setHandler(ImageHandler hand) {
        main = hand;
        img = main.getImg1();
    }

    public void add(Buffer addi) {
        final String added = addi.getName();
        JMenuItem uusi = new JMenuItem(added);

        main.getMenu5().add(uusi);
        uusi.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                img.setBuffer(added);
                main.getScr().updateUI();
            }
        });
   }
}

这是它应该工作的方式。为了这个网站,我把原始的芬兰语名字翻译成了英语,想知道为什么我最初用芬兰语写这些名字……我不会给东西命名。

方法add应该在程序运行时被多次调用。

我不能真正理解的是接口ActionListener的内部类实现,即它的编译和它是如何工作的。

如果我的界面上有两个按钮,我希望它们做不同的事情,我需要两个内部类,每个类一个,每个类都有自己的接口ActionListener的内部实现。但在我的代码中,有一个类似乎完成了许多工作,一个为它编译的.class-file,但最终的结果就好像有很多个。

有人能在这个问题上给我讲讲吗?这里的代码是一个类,新的按钮是它的实例吗?他们是新班级吗?每个新按钮都应该有一个新的.class-file吗?等等。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2012-11-17 00:10:16

通常,内部类在只调用一次的代码中被实例化(例如,当您在构造函数中扩展JPanel并将ActionListeners添加到JButton中时)。在这里,您在一个方法中实例化一个内部类,并多次调用该方法(如果我正确理解您的描述的话)。每次调用add()时,都会创建内部类的一个新实例。与命名类一样,只有一个类,但可能有许多实例。

票数 5
EN

Stack Overflow用户

发布于 2012-11-17 00:15:57

在此代码中:

代码语言:javascript
复制
public void add(Buffer addi) {
    . . .
    uusi.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            img.setBuffer(added);
            main.getScr().updateUI();
        }
    });
}

new ActionListener() {...}构造是一个匿名内部类。它的行为就像是被单独声明为常规内部类一样。主要区别在于名称是由编译器自动生成的。相当于:

代码语言:javascript
复制
private class Anonymous implements ActionListener {
    public void actionPerformed(ActionEvent e) {
        img.setBuffer(added);
        main.getScr().updateUI();
    }
}

public void add(Buffer addi) {
    . . .
    uusi.addActionListener(new Anonymous());
}

每次执行addActionListener代码时,它都会创建此类的一个新实例。

匿名内部类还有一些其他限制,这些限制是匿名的后果。例如,如果它们声明了字段,则只能从类中访问这些字段(不使用反射)。

票数 3
EN

Stack Overflow用户

发布于 2012-11-17 00:10:34

您正在为菜单项操作侦听器创建新的匿名类。

基本上,你的代码

代码语言:javascript
复制
menuItem.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent e) {
      img.setBuffer(added);
      main.getScr().updateUI();
  }
});

为ActionListener定义新的类实现

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13420151

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档