前段时间我用 Java 编写了一个小型图像查看器/处理程序,如果您愿意的话,它是一个小型 Photoshop。
我希望有一个下拉菜单,我可以在其中选择我打开的图像中的哪一张“在桌面上”,即。显示和应用的方法。我希望图像的名称成为菜单中显示的 JMenuItem 的名称。我还希望在添加新图像时出现一个新按钮。
我对此疑惑了一段时间,最终提出了这个解决方案,这是一个新类,用于在添加图像时处理新按钮的创建。代码如下:
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 方法应该在程序运行时被多次调用。
我真正无法理解的是接口(interface) ActionListener 的内部类实现,即它的编译和工作原理。
如果我的界面上有两个按钮并且我希望它们做不同的事情,我需要两个内部类,一个对应一个,每个都有自己的接口(interface) ActionListener 的内部实现。但在我的代码中,有一个类似乎可以完成许多工作,一个编译的 .class 文件,但最终结果就像有很多一样。
有人可以就这个问题教育我吗?这段代码是一个类吗,新按钮是它的实例吗?他们是新类(class)吗?每个新按钮都应该有一个新的 .class 文件吗?等等……
最佳答案
通常,内部类在只调用一次的代码中实例化(例如,当您扩展 JPanel
并将 ActionListeners
添加到 JButton
时s 在构造函数中)。在这里,您在多次调用的方法中实例化一个内部类(如果我正确理解您的描述)。每次调用 add()
时,都会创建内部类的一个新实例。与命名类一样,只有一个类,但可能有很多实例。
关于Java内部类的使用和实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13420151/