java:将匿名内部类转换为具体类
我有以下匿名类java:将匿名内部类转换为具体类,java,swing,Java,Swing,我有以下匿名类 box = new JComboBox(filename); ... box.addItemListener( new ItemListener() { public void itemStateChanged(ItemEvent event ) { if (event.getSta
box = new JComboBox(filename);
...
box.addItemListener(
new ItemListener() {
public void itemStateChanged(ItemEvent event )
{
if (event.getStateChange() == ItemEvent.SELECTED)
picture.setIcon(pics[box.getSelectedIndex()]);
}
}
);
我试图将其转换为一个具体的类,其中包含以下内容:
import java.awt.*;
import java.awt.Event.*;
import javax.swing.*;
public class Gui extends JFrame {
...
public Gui () {
box.addItemListener(new Handler());
...
add(box);
}
class Handler extends ItemListener {
public void itemStateChanged (ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
picture.setIcon(pics[box.getSelectedIndex()]);
}//end if
}//end itemstatechanged
}
你知道我做错了什么吗?
我得到的错误是找不到符号ItemListener,因为
ItemListener
是一个接口
,所以需要使用关键字实现
class Handler implements ItemListener {
另外,当我创建监听器时,我通常将它们作为私有成员变量,以防我想重用它们
private ItemListener setIconHandler = new ItemListener() {
public void itemStateChanged (ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
picture.setIcon(pics[box.getSelectedIndex()]);
}//end if
}//end itemstatechanged
};
这样,您就可以重用侦听器,而不必定义一个只使用一两次的类
此外,为了完整性,您需要修复导入。这一点,是由其他人回答的。您应该使用
import java.awt.event.ItemListener代码>而不是导入java.awt.Event.*代码>是否应该是实现ItemListener
您需要通过以下方式导入:
import java.awt.event.ItemListener代码>
导入java.awt.Event.*
在java.awt中导入类事件的内部类。ItemListener
是一个接口,因此您需要实现它,而不是从中扩展它
每当出现错误或异常时,您还需要为ItemListener和ItemEvent添加导入语句。。尽可能多地张贴。如果它指向一条特定的线,也包括这条线。一次打四次。尽管如此,我还是想提一提,我所知道的所有现代IDE都支持“将匿名转换为内部”重构,这会自动为您实现。@Justin,看起来他正在导入事件。*而不是事件。*@Justin'jjnguy'Nelson:不完全是。他正在导入事件。*注意事件。*@sblundy,是的,我现在看到了。很好的捕获。需要澄清的是,java.awt中有一个名为Event的类。它的子元素是被导入的。私有成员变量非常灵活。在构造函数外部声明私有成员变量后,如何重用它?它会是box.addItemListener(setIconHandler)?