2014-03-04 2 views
2

Хорошо. Я не уверен в названии моего вопроса и использовал ли я правильные слова. Поскольку я являюсь самоотверженным полным любителем, мне трудно задавать свой вопрос, поскольку я не знаю правильных условий для вещей, поэтому я напишу что-то в коде, а затем задаю свой вопрос. Я написал его без импортных инструкций, настройки макетов и полос прокрутки и некоторые другие вещи, чтобы упростить его.Как определить источник события в ActionListener?

public class Foo{ 
    JTextArea text; 

    public static void main(String[] args){ 
     Foo foo = new Foo; 
     foo.go(); 
    } 

    public void go(){ 
     JFrame frame = new JFrame(); 
     JButton button = new JButton("One"); 
     JButton button2 = new JButton("Two"); 
     JPanel panel = new JPanel(); 

     frame.setVisible(true); 
     frame.setSize(600, 300); 

     frame.getContentPane().add(BorderLayout.EAST, panel); 
     panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS)); 
     panel.add(button); 
     panel.add(button2); 

     text = new JTextArea(10, 20); 
     panel.add(text); 

     button.addActionListener(new ButtLis()); 
     button2.addActionListener(new ButtLis()); 
    } 

    class ButtLis implements ActionListener{ 
     @override 
     // this is where I have the problem 

     text.append(); 
    } 

}

То, что я хочу, если заявление, чтобы войти в мой внутренний класс (ButtLis), который будет определять, какая из кнопок нажата, а затем добавить некоторый текст в JTextArea на основе этого. Но я не знаю, как позвонить, чтобы узнать, какая кнопка была нажата.

+1

'event.getSource()' в вашем ActionPerformed (событие ActionEvent) '. Вам нужно будет отбросить его соответствующим образом. –

+0

См. Http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html –

ответ

2

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

class ButtLis implements ActionListener{ 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     String command = e.getActionCommand(); 
     if ("One".equals(command)) { 
      // do something 
     } 
    } 
} 

Если вы хотите сравнить источник объекта, вы должны дать ваши кнопки глобальности

public class Foo { 
    JButton button = new JButton("One"); 
    JButton button2 = new JButton("Two"); 

    class ButtLis implements ActionListener{ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (e.getSource() == button) { 

      } 
     } 
    } 
} 

Третий вариант заключается в регистрации кнопки индивидуально

public void go() { 
    ... 
    button.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      // do something 
     } 
    }); 
} 

Смотри на How to use Common Button и How to Write ActionListeners

+1

Спасибо. Это похоже на то, что я ищу. И после того, как я отправил сообщение, я подумал: «О, зависайся, возможно, у кнопок должен быть глобальный охват», но просто оставил их внутри метода, ленив и понял, что кто-то это укажет. –

1

Я думаю, что это то, что вы ищете, хотя я вряд ли бы рекомендовать его:

class ButtLis implements ActionListener { 
    private JTextArea text; 

    public ButtLis(JTextArea text) { 
     this.text = text; 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     JButton button = (JButton)e.getSource(); // Warning! This is not good coding practice, because you don't know that the source will be a button 
     text.append(button.getText()); 
    } 
} 

Вместо этого, я бы рекомендовал:

JButton button1 = new JButton("One"); 
button1.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     text.append("one"); 
    } 
}); 

, который использует «анонимный внутренний класс ", чтобы определить прослушиватель действий. Для Button2 вы бы сказали подобное. Преимущества здесь в том, что прослушиватель действий находится рядом с кнопкой, над которой он работает, и это мешает вам иметь единственный ActionListener, который должен проверять, откуда произошло каждое событие (с использованием).

+0

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

0

Внутри вашего ButtLis, добавьте этот

class ButtLis implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     e.getSource(); 
     //Your implementation 
    } 
} 
Смежные вопросы