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)?