简体   繁体   English

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

[英]java : converting anonymous inner class to concrete class

I have the following anonymous class 我有以下匿名课程

box = new JComboBox(filename);
...
    box.addItemListener(
                    new ItemListener() {
                        public void itemStateChanged(ItemEvent event )
                        {
                            if (event.getStateChange() == ItemEvent.SELECTED)
                                picture.setIcon(pics[box.getSelectedIndex()]);



                        }
                    }
               );

I'm trying to convert this to a concrete class with the following: 我正在尝试使用以下内容将其转换为具体类:

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 
        }

Any ideas on what I'm doing wrong? 关于我做错了什么的任何想法? the error i get says it can't find the symbol ItemListener 我得到的错误说它找不到符号ItemListener

Since ItemListener is an interface , you need to use the keyword implements . 由于ItemListener是一个interface ,因此您需要使用关键字implements

class Handler implements ItemListener {

Also, when I create my listeners I usually make them a private member variable in case I want to reuse them. 此外,当我创建我的监听器时,我通常会将它们作为私有成员变量,以防我想重用它们。

private ItemListener setIconHandler = new ItemListener() {
    public void itemStateChanged (ItemEvent e)  {
        if (e.getStateChange() == ItemEvent.SELECTED) {
            picture.setIcon(pics[box.getSelectedIndex()]);

        }//end if 

    }//end itemstatechanged 
};

This way you can reuse the listener, and you don't have to define a class that you are only going to use once or twice. 这样您就可以重用侦听器,而不必定义只使用一次或两次的类。

Also, for completeness, you need to fix your imports. 此外,为了完整性,您需要修复导入。 This was not caught by me , but by other people answering the question. 不是 我抓住的 ,而是其他人回答这个问题。 You should use import java.awt.event.ItemListener; 你应该使用import java.awt.event.ItemListener; instead of import java.awt.Event.*; 而不是import java.awt.Event.*; .

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

Shouldn't it be implements ItemListener ? 它不应该是implements ItemListener吗?

And you'll need to import it via: 你需要通过以下方式导入它:

import java.awt.event.ItemListener;

import java.awt.Event.*; imports the inner classes of the class Event in java.awt. 在java.awt中导入类Event的内部类。

ItemListener是一个接口,因此您需要implement它,而不是从它extend

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM