2013-10-01 6 views
0

Как назначить две кнопки для совместного использования одного и того же класса для обработки событий в Java/swing?обработка событий в java swing

К примеру, у меня есть это:

private class BtnEvtHandler implements ActionListener { 

     private int counter=10; 

     public void actionPerformed(ActionEvent e) { 
      gs.setX(counter); 
      gs.repaint(); 
      counter=counter+10; 
     } 

     public void actionPerformed(ActionEvent e) { 

       //action for move button 
     } 

    } 

     JButton jumpBtn= new JButton("JUMP"); 
     BtnEvtHandler okButtonHandler= new BtnEvtHandler(); 
     (jumpBtn).addActionListener(okButtonHandler); 
     menuPanel.add(jumpBtn); 

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

 JButton moveBtn= new JButton("MOVE"); 
     menuPanel.add(moveBtn); 
     (moveBtn).addActionListener(okButtonHandler); 
+0

Затем вы можете добавить аргументы в свой BtnEvtHandler, чтобы определить, что делать. Что-то вроде 'public BtnEvtHandler (Object WHAT_TO_DO)', где Object imo должен быть перечислением, это может зависеть от того, какую логику вы хотите делать в рамках события. Тогда ваш 'actionPerformed' может иметь оператор switch для определения логики, основанной на аргументе WHAT_TO_DO. – porfiriopartida

+0

Вы также можете проверить 'ActionEvent e' на' e.getSource() 'или' e.getActionCommand() 'и решить, что делать. – DSquare

ответ

1

Вы не можете повторно использовать один ActionListener и ожидать, что для вызова другого метода в зависимости от кнопки вы приложите его. У договора ActionListener есть один метод, который вызывается. Но вы можете проверить источник события и управлять потоком на основе этого. Вот пример:

package com.sandbox; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.WindowConstants; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.IOException; 

public class SwingSandbox { 

    public static void main(String[] args) throws IOException { 
     JFrame frame = buildFrame(); 

     JPanel pane = new JPanel(); 

     MyActionListener myActionListener = new MyActionListener(); 

     JButton button1 = new JButton("Button1"); 
     button1.addActionListener(myActionListener); 
     pane.add(button1); 
     JButton button2 = new JButton("Button2"); 
     button2.addActionListener(myActionListener); 
     pane.add(button2); 


     frame.add(pane); 
    } 


    private static JFrame buildFrame() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     frame.setSize(200, 200); 
     frame.setVisible(true); 
     return frame; 
    } 


    private static class MyActionListener implements ActionListener { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      JButton source = (JButton) e.getSource(); 
      if ("Button1".equals(source.getText())) { 
       System.out.println("You clicked button 1"); 
      } else { 
       System.out.println("You clicked button 2"); 
      } 
     } 
    } 

} 
+0

Нет, я хочу иметь другое событие метода для moveBtn, которое может быть частью класса BtnEvtHandler. Другими словами, я хочу иметь другой метод actionPerformed для кнопки перемещения. –

+1

Затем создайте для него другой «ActionListener»? ** Что вы пробовали? Что это за проблема? ** –

+0

@Jack_of_All_Trades, что вы подразумеваете под «разными»? – porfiriopartida

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