2016-07-27 5 views
0

Может ли кто-нибудь заставить меня понять поток этой логики, Когда нажата кнопка b1, происходит какое-то действие (некоторые выполняемые операторы), но почему мы дали синтаксис, как показано ниже, создается ActionEvent объект ae и как он работает ? Если я не использую класс Inner, то у меня есть другое представление для этого?Как работает ActionEvent и как его объект создается, чтобы выполнить задачу при нажатии кнопки?

JButton b1=new JButton(); 
b1.addActionListener((ActionEvent ae) -> { 
    //Statements; 
}); 
+0

Что вы подразумеваете под 'У меня есть другое представление для этого?'? – user3437460

+0

Вам нужно прочитать на языке Lambda выражение и анонимные классы в Интернете –

ответ

0

Все ActionListeners реализовать функцию:

public void actionPerformed(ActionEvent e) { 
    ...//code that reacts to the action... 
} 

Этот код создает новый анонимный класс, который реализует ActionListener и переписывает функцию actionPerformed к тому, что вы хотите. Новый объект с помощью этой функции добавляется внутренний список Foo о ActionListeners:

foo.addActionListener(new ActionListener() { 
    @Override public void actionPerformed(ActionEvent e) { 
     ...//code that reacts to the action... 
    } 
}); 

Сокращение для этого является использование лямбда-выражения, как ActionListener имеет только одну функцию перезаписи, так что компилятор знает, какой из них вам означает (см документацию по лямбды для получения дополнительной информации):

foo.addActionListener( 
    (e) -> { 
     ...\code that reacts to the action... 
    } 
); 

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

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

+0

Очень красиво объяснил, получил вашу мысль, спасибо за такие слова. , , :) – Deepak

0

Вы можете добавить такие мероприятия как это.

JButton b1 = new JButton(); 
b1.addActionListener(this); 

, то вы должны сделать этот класс

public void actionPerfomed(ActionEvent ae){ 
    if(ae.getSource()==b1){ 
     //your commands here 
    } 
} 

Примечание: Убедитесь, что implent ActionListener.

 Смежные вопросы

  • Нет связанных вопросов^_^