Как пользовательские действия слушателей - PullRequest
4 голосов
/ 20 октября 2011

Я новичок в Swing и мне нужна помощь со слушателями действий.Я видел их, как в этом примере:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        // Do something
    }
});

Однако я хочу сделать что-то более похожее на это:

button.addActionListener(myFunc);

public void myFunc(ActionEvent e) 
{
   // Do something
}

Это возможно?

Ответы [ 5 ]

7 голосов
/ 20 октября 2011

Здесь возможны два подхода - либо вы можете просто вызвать свой метод myFunc непосредственно из первого примера, который вы приведете:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myFunc(e);
    }
});

... Или вы можете определить внутренний класс, который реализует actionlistener, а затем использоватьчто:

class MyActionListener implements ActionListener {
    public void actionPerformed(ActionEvent e) { 
        //Your code
    }
}

button.addActionListener(new MyActionListener());

На футуристической ноте, когда Java 8 появится на полках (2013, так что не задерживайте дыхание), вы сможете сделать это более кратко, используя замыкания.

4 голосов
/ 20 октября 2011

Если вы хотите избежать дополнительных классов, вы можете использовать отражающий класс батут. Я написал служебный класс для этого:

http://softsmithy.sourceforge.net/lib/docs/api/org/softsmithy/lib/swing/action/ReflectiveXAction.html

Подробнее о рефлексивных действиях можно прочитать: Глава 6.2.3, с. 73 книги серии Java Стратегия и тактика повышения производительности платформы Java от Стива Уилсона и Джеффа Кессельмана.

Учебник

http://softsmithy.sourceforge.net/lib/docs/tutorial/swing/action/index.html

Maven:

<dependency>  
    <groupId>org.softsmithy.lib</groupId>  
    <artifactId>lib-core</artifactId>  
    <version>0.1</version>  
</dependency>  

Скачать:

http://sourceforge.net/projects/softsmithy/files/softsmithy/v0.1/

3 голосов
/ 20 октября 2011

Это было бы возможно, только если метод вернул ActionListener, иначе нет. Конечно, вполне допустимо делегировать обработку ActionEvent отдельному методу.

3 голосов
/ 20 октября 2011

Очень просто:

button.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        myFunc(e);
    }
});


public void myFunc(ActionEvent e) 
{
   // Do something
}

... я знаю, что это немного шаблонно ... но java не поддерживает передачу функций в качестве параметров.

1 голос
/ 09 января 2014

Если вы хотите использовать Java 8 лямбда-выражение

button.addActionListener(ae -> myFunc(ae));

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

    ActionListener myFunc = new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            //code
        }
    };

    button.addActionListener(myFunc);
...