Запрос передового опыта ActionListener и ActionEvent

в моем коде у меня в настоящее время есть все мои внутренние классы ActionListener как Anonymous, например:

item.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            //code here
        }
    }

теперь это нормально для меня, когда код состоит не более чем из 20 строк, но он кажется неуклюжим для более чем 20 строк. Итак, я мог бы реализовать ActionListener и иметь метод

ActionPerformed(ActionEvent ae)
{
    if ae.getSource() == item
    {
        // code here too
    }
}

но у меня нет намерения повторно использовать этот код где-либо еще... Я мог бы создать еще один класс для обработки этого, но это не очень помогает, поскольку я все еще хочу использовать переменные, которые были созданы в моем родительском классе.

То, что я действительно хотел бы сделать, это использовать такой синтаксис:

private void btnAction()
{
    // do code
{

public static void main(String[] args)
{
    btn.addActionListener(btnAction)
}

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


person penfold1992    schedule 26.03.2015    source источник
comment
Почему бы не использовать неанонимный внутренний класс?   -  person RealSkeptic    schedule 26.03.2015
comment
Не могли бы вы объяснить это? Я не знаком с неанонимным внутренним классом   -  person penfold1992    schedule 27.03.2015
comment
Базовый внутренний класс с именем, определенным как член класса.   -  person RealSkeptic    schedule 27.03.2015


Ответы (2)


Используя Java 8, вы можете сделать это:

btn.addActionListener(e -> btnAction());

Подробнее о лямбда-выражениях читайте здесь: http://www.oracle.com/technetwork/articles/java/architect-lambdas-part1-2080972.html

person Kevin Workman    schedule 26.03.2015
comment
К сожалению... Я использую Java 6. Lambdas действительно намного проще и менее загромождены, но, к сожалению, у меня нет правильной версии Java для их использования :( - person penfold1992; 27.03.2015
comment
@penfold1992 Java 6 подошел к концу в феврале 2013 года. Его использование представляет собой довольно большой риск для безопасности, поэтому вам лучше иметь очень вескую причину для его использования! - person Kevin Workman; 27.03.2015
comment
ну, у меня есть достаточно веская причина... Я работаю в очень крупной компании, в которой работает более 50 000 человек, и у меня нет никаких сил убедить компанию в необходимости обновления до Java 8. это то, что мне нужно для работы. с :( - person penfold1992; 29.03.2015

Если все кнопки выполняют один и тот же код, вы можете определить (именованный) внутренний класс, который реализует ActionListener и запускает код, или вы даже можете сделать свой охватывающий класс ActionListener и добавить его в качестве прослушивателя действий для всех кнопок, чтобы его actionPerformed() запускает код для всех.


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

private void btnActionOK(ActionEvent e) {
    // do code
}
private void btnActionBack(ActionEvent e) {
    // do code
}
private void btnActionForward(ActionEvent e) {
    // do code
}

и т.п.

Затем вы создаете анонимный класс, но единственное, что делает его actionPerformed(), — это вызывает соответствующий метод.

okButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionOK(e);
    }
});
backButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionBack(e);
    }
});
forwardButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        btnActionForward(e);
    }
});

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

person RealSkeptic    schedule 27.03.2015