Java: преобразование анонимного внутреннего класса в конкретный класс - PullRequest
3 голосов
/ 27 января 2011

У меня есть следующий анонимный класс

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 ]

2 голосов
/ 27 января 2011

Вам также необходимо добавить операторы импорта для ItemListener и ItemEvent.

2 голосов
/ 27 января 2011

Поскольку ItemListener является interface, вам необходимо использовать ключевое слово 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 
};

Таким образом, вы можете повторно использовать слушателя, и вам не нужно определять класс, который вы собираетесь использовать только один или два раза.

Кроме того, для полноты вынужно исправить ваш импорт.Этот был не пойман мной , но другими людьми, отвечающими на вопрос.Вы должны использовать import java.awt.event.ItemListener; вместо import java.awt.Event.*;.

0 голосов
/ 27 января 2011

ItemListener - это интерфейс, поэтому вам нужно implement, а не extend с него

0 голосов
/ 27 января 2011

Разве это не должно быть implements ItemListener?

И вам нужно будет импортировать его через:

import java.awt.event.ItemListener;

import java.awt.Event.*; импортирует внутренние классы класса Event в java.awt.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...