2009-02-19 2 views
0

Я пишу небольшое приложение Java (в Windows, следовательно, _on_vista прилагается к моему имени).Обработчики событий Java

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

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

Благодаря

cool_button_1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     coolfunction1(); 
    } 
}); 

cool_button_2.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     coolfunction2(); 
    } 
}); 

// etc ... 

Функции, которые вызываются породит от темы, по мере необходимости, так далее и так вперед.

ОБНОВЛЕНИЕ - Оба были хорошими (почти одинаковыми) ответами. Я согласился с тем, кто имеет низшую репутацию, чтобы разделить богатство. Еще раз спасибо ребятам.

ответ

3

Да, это правильный способ сделать это. Это немного неуклюжий (нужно написать пять длинных строк кода, чтобы можно было вызвать метод), но это Java :(

+0

ха-ха, примерно через год php, работа над этим проектом в java - это абсолютный восторг! настоящий язык api - это то, что я принял как должное. – 2009-02-19 14:15:38

+0

Вы не пишете пять строк для вызова метода. Вы пишете пять строк для вызова метода при нажатии кнопки. Это разница. – Bombe

+0

Я думаю, что возражение Аарона состояло в том, что некоторые языки просто позволят вам передать указатель на функцию coolfunction1, вместо того, чтобы обернуть его новым объектом. –

0

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

+0

Я не использовал закрытие, потому что я их не понимал, но ваш комментарий начинает связывать некоторые точки для me, thanks – 2009-02-19 14:17:29

+0

Конечно, локальные классы (довольно минимальные) замыкания. –

+0

В принципе, закрытие - это автономный метод (без класса), который вы можете передать как параметр в метод - именно то, что необходимо в вашем примере. классы, которые вы используете, имеют одинаковую функциональность, просто с большим количеством шаблонов вокруг очень маленького кода. –

1

Это не так уж плохо, я предпочитаю использовать Actions и создать JButtons из них:

Action fooAction = new AbstractAction() { ... }; 
JButton fooButton = new JButton(fooAction); 
+0

Спасибо за ввод, я буду помнить об этом, если сталкиваюсь с подобной проблемой. – 2009-02-19 14:20:42

+0

Да, вы можете повторно использовать действия с меню и отключите их. –

1

Его один из правильных способов для этого.

Вы используете анонс МЫ слушатели, но есть Alternatif

хорошо объяснен на http://java.sun.com/docs/books/tutorial/uiswing/events/intro.html

где вы пишете класс, который реализует ActionListener и он использует логику для вас

0

я склонен сделать что-то вроде этого:

public class ButtonPanel implements ActionListener { 
    JButton button1, button2, button3; 
    public ButtonPanel() { 
     button1 = new JButton(this); 
     button2 = new JButton(this); 
     button3 = new JButton(this): 
     ... 
    } 

    public void ActionPerformed(ActionEvent e) { 
     if(e.getSource() == button1) action1(); 
     else if(e.getSouce() == button2 ) action2(); 
     else if(e.getSource() == button3) action3(); 
    } 
} 
+1

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

+0

Это вопрос приоритетов; является ли чистый API или легко читаемый код более важным для вашего набора ограничений. Я не думаю, что мое предложение - это то, что хорошо * большую часть времени *, но это, безусловно, еще один правильный способ сделать что-то. Я немного разочарован тем, что вы проголосовали за это. Ах хорошо. – JoshuaD

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