2015-03-26 1 views
0

в моем коде, я в настоящее время есть все мои ActionListener в качестве анонимных внутренних классов, как так:ActionListener и лучшая практика ActionEvent запрос

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

теперь это чувствует себя хорошо для меня, когда код не более 20ish линии, однако он чувствует себя clunky для более чем 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) 
} 

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

+0

Почему бы не использовать не анонимный внутренний класс? – RealSkeptic

+0

Не могли бы вы объяснить это? Я не знаком с неанонимным внутренним классом – penfold1992

+0

Основной [внутренний класс] (https://docs.oracle.com/javase/tutorial/java/javaOO/innerclasses.html) с именем, определенным как член класса. – RealSkeptic

ответ

0

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

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

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

+0

К сожалению ... Я использую Java 6. lambdas действительно намного проще и менее загромождены, но, к сожалению, у меня нет правильной версии Java, чтобы использовать их :( – penfold1992

+0

@ penfold1992 Java 6 достиг своего конца жизни в феврале 2013 года. это довольно большой риск для безопасности, поэтому у вас есть все основания для его использования! –

+0

хорошо, у меня есть достаточно хорошая причина ... Я работаю в очень большой компании из более чем 50 000 человек, и у меня нет никакой власти убедить компанию, что необходимо будет обновить до Java 8. его просто то, с чем мне нужно работать :( – penfold1992

0

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


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

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

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