2013-08-06 4 views
3

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

+1

Это возможно ... но вам нужно будет использовать блок 'switch' или кучу блоков' if-then-else', чтобы выполнить код, соответствующий этой кнопке. Это решение является хрупким, трудноподдерживаемым и трудночитаемым. Кроме того, он не дает преимуществ в производительности. Нет никакой веской причины использовать этот шаблон. Идеальная идея - единственный метод или один функциональный объект для каждой кнопки. Одно из возможных исключений было бы, если бы все кнопки выполняли один и тот же код, но даже тогда было бы лучше реализовать общий код в частном вспомогательном методе. – scottb

+0

«да» на первый вопрос, «попробуй и возвращайся с любыми проблемами» для второго. –

ответ

3

да, конечно, вы можете

class myActionListener implements ActionListener { 
    ... 
    public void actionPerformed(ActionEvent e) { 
     // your handle button click code 
    } 
} 

и в JFrame

myActionListener listener = new myActionListener(); 
button1.addActionListener(listener); 
button2.addActionListener(listener); 
button3.addActionListener(listener); 

и так далее

2
// Create your buttons. 
JButton button1 = new JButton("Button 1"); 
JButton button2 = new JButton("Button 2"); 
JButton button3 = new JButton("Button 3"); 
// ... 

// Create the action listener to add to your buttons. 
ActionListener actionListener = new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
    // Execute whatever should happen on button click. 
    } 
} 

// Add the action listener to your buttons. 
button1.addActionListener(actionListener);  
button2.addActionListener(actionListener); 
button3.addActionListener(actionListener); 
// ... 
1

Вы можете сделать это, в методе actionPerformed получить команду действий и для каждой кнопки Задать команду Действие

ActionListener al_button1 = new ActionListner(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      String action = e.getActionCommand(); 
      if (action.equals("button1Command")){ 
        //do button 1 command 
      } else if (action.equals("button2Command")){ 
        //do button 2 command 
      } 
      //... 

     } 
} 
//add listener to the buttons 
button1.addActionListener(al_buttons) 
button2.addActionListener(al_buttons) 
// set actioncommand for buttons 
button1.setActionCommand("button1Command"); 
button2.setActionCommand("button2Command"); 
4

Вы могли бы это сделать, но тогда вам придется Де- мультиплексировать все эти вызовы, идущие к «одному контроллеру», который управляет ими всеми, если у вас нет уникального обстоятельства, когда все кнопки должны делать то же самое.

Это демультиплексирование, вероятно, связано с коммутатором (или, что еще хуже, связью операторов if/then), и этот коммутатор станет головной болью обслуживания. См. examples of how this could be bad here.

1

Проверьте source на ActionEvent, и сделать проверку равенства в отношении каждого из ваши кнопки, чтобы увидеть, что вызвало ActionEvent. Затем вы можете использовать свой единственный слушатель для всех кнопок.

final JButton button1 = new JButton(); 
    final JButton button2 = new JButton(); 
    ActionListener l = new ActionListener() { 
     public void actionPerformed(final ActionEvent e) { 
      if (e.getSource() == button1) { 
       // do button1 action 
      } else if (e.getSource() == button2) { 
       // do button2 action 
      } 
     } 
    }; 
    button1.addActionListener(l); 
    button2.addActionListener(l); 
Смежные вопросы