Как вызвать разные actionListeners? - PullRequest
1 голос
/ 10 ноября 2011

В моей программе одна кнопка, а другая - JTextField.Слушатель действий для кнопки и текстового поля различен.Я использую:

textfield.addActionListener(this);<br> button.addActionListener(this);

... внутри моего конструктора.

Они оба выполняют один и тот же actionListener.Как я могу вызвать их соответствующие методы?

Ответы [ 6 ]

3 голосов
/ 10 ноября 2011

Вы реализуете ActionListener в классе обоих компонентов.Таким образом, когда происходит действие, метод actionPerformed класса вызывается для них обоих.Чтобы разделить их, вы можете сделать следующее:

1-Создать отдельный класс, внедрить в него интерфейс ActionListener и добавить его в качестве actionListener для одного из компонентов.

2-In actionPerformed метод, есть параметр с типом ActionEvent.Вызовите getSource метод этого и проверьте, возвращает ли он объект JTextField или JButton, поместив оператор if, и сделайте отдельные вещи соответственно.

3 голосов
/ 10 ноября 2011

Очевидно, что оба компонента разделяют ActionListener. Если вы хотите определить, какой компонент сгенерировал ActionEvent, вызовите getSource(). И оттуда вы можете привести тип (если необходимо), а затем вызвать методы этого конкретного компонента.

1 голос
/ 13 мая 2015

Для меня самый простой способ сделать то, что спрашивают, это:

textfield.addActionListener(this);
button.addActionListener(this);
...
public void actionPerformed(ActionEvent e){
    if( e.getSource().getClass().equals(JTextField.class) ){
        System.out.println("textfield");
        //Código para el textfield
    }
    if( e.getSource().getClass().equals(JButton.class) ){
        System.out.println("JButton");
        //Código para el JButton
    }
}
0 голосов
/ 10 ноября 2011

Просто установите разные ActionCommands для каждого компонента.
В методе actionPerformed вы можете проверить ActionCommand события:

private static final String TEXT_CMD = "text";  // or something more meaningful
private static final String BUTTON_CMD = "button";

...

    textfield.setActionCommand(TEXT_CMD);
    textfield.addActionListener(this);

    button.setActionCommand(BUTTON_CMD);
    button.addActionListener(this);

...

public void actionPerformed(ActionEvent ev) {
    switch (ev.getActionCommand()) {
        case TEXT_CMD:
            // do textfield stuff here
            break;
        case BUTTON_CMD:
            // do button stuff here
            break;
        default:
            // error message?
            break;
    }
}
0 голосов
/ 10 ноября 2011

Хотя, если вы не дали свой пример кода, но я могу понять, что там есть.

Вот пример того, как добавить слушателя к любому JComponent.(Не пытайтесь запустить этот код !!!)

import java.awt.Button;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

public class EventListeners extends JFrame implements ActionListener {
    TextArea txtArea;
    String Add, Subtract, Multiply, Divide;
    int i = 10, j = 20, sum = 0, Sub = 0, Mul = 0, Div = 0;

    public void init() {
        txtArea = new TextArea(10, 20);
        txtArea.setEditable(false);
        add(txtArea, "center");
        Button b = new Button("Add");
        Button c = new Button("Subtract");
        Button d = new Button("Multiply");
        Button e = new Button("Divide");

        // YOU ARE DOING SOMETHING LIKE THIS
        // THIS WILL WORK, BUT CAN BE A BAD EXMPLE
        b.addActionListener(this);
        c.addActionListener(this);
        d.addActionListener(this);
        e.addActionListener(this);

        add(b);
        add(c);
        add(d);
        add(e);
    }

    public void actionPerformed(ActionEvent e) {
        sum = i + j;
        txtArea.setText("");
        txtArea.append("i = " + i + "\t" + "j = " + j + "\n");
        Button source = (Button) e.getSource();

        // you can work with them like shown below
                    Button source = (Button) e.getSource();
        if (source.getLabel() == "Add") {
            txtArea.append("Sum : " + sum + "\n");
        }
        if (source.getLabel() == "Subtract") {
            txtArea.append("Sub : " + Sub + "\n");
        }
        if (source.getLabel() == "Multiply") {
            txtArea.append("Mul = " + Mul + "\n");
        }
        if (source.getLabel() == "Divide") {
            txtArea.append("Divide = " + Div);
        }
    }
}

ОБНОВЛЕНИЕ

Вы должны сделать что-то вроде ниже

        Button b = new Button("Add");
        Button c = new Button("Subtract");
        b.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // implement what is expected for b button 
            }
        });
        c.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // implement what is expected for c button 
            }
        });
        // and so on...
        // but yes we can improve it
0 голосов
/ 10 ноября 2011

Когда слушатель действия активирован, потому что кто-то нажимает на вашу кнопку, вызывается метод actionPerformed. Поскольку вы устанавливаете this в качестве слушателя действия, в вашем классе должен быть метод actionPerformed. Этот метод вызывается в обоих случаях.

Что-то вроде:

class MyClass implements ActionListener {

  public MyClass() {
    ...
    textfield.addActionListener(this) ;
    button.addActionListener(this) ;
    ...
  }

  public void actionPerformed(ActionEvent e) {
    // This is the method being called when:
    // - the button is clicked and
    // - the textfield activated
  }
}
...