java:将匿名内部类转换为具体类

时间:2011-01-27 15:59:43

标签: java swing

我有以下匿名类

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

4 个答案:

答案 0 :(得分:2)

由于ItemListenerinterface,您需要使用关键字implements

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 
};

通过这种方式,您可以重用侦听器,而不必定义只使用一次或两次的类。

另外,为了完整性,您需要修复导入。这was not caught by me,但其他人回答了这个问题。您应该使用import java.awt.event.ItemListener;代替import java.awt.Event.*;

答案 1 :(得分:2)

您还需要为ItemListener和ItemEvent添加import语句。

答案 2 :(得分:0)

不应该是implements ItemListener吗?

您需要通过以下方式导入:

import java.awt.event.ItemListener;

import java.awt.Event.*;在java.awt中导入类Event的内部类。

答案 3 :(得分:0)

ItemListener是一个界面,因此您需要implement,而不是extend