В чем разница между addActionListener (это) и addActionListener (новый ActionListener)? - PullRequest
0 голосов
/ 15 сентября 2011

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

  1. Реализуйте интерфейс ActionListener, а затем добавьте прослушиватели событий к кнопкам.

Пример:

countButton.addActionListener(this);

И метод ActionPerformed будет запущен для отображения результата.

  1. Не реализуйте интерфейс ActionListener, а вместо этого сделайте следующее:

    countButton.addActionListener(new ActionListener() {
    
        public void actionPerformed(ActionEvent e)
        {
            //Execute when button is pressed
            System.out.println("You clicked the button");
        }
    });  
    

Как точно работает второй метод ????? !!!

Спасибо!

Ответы [ 5 ]

3 голосов
/ 15 сентября 2011

Нет необходимости определять второй класс для первого подхода. Вам просто нужно добавить
public void actionPerformed(ActionEvent e) метод внутри вашего класса и делайте там, что хотите, после того, как вы заставите свой класс реализовать ActionListener. Вы можете использовать второй класс, если хотите, но это не обязательно. Недостатком является то, что вам нужно указывать источник события с помощью длинных операторов if, чтобы предпринять соответствующее действие, если у вас более одного JButtons, т.е.

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

countButton.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        doCountButtonAction(e);
        // "this" here would refer to the ActionListener (not that useful)
    }
}); 

и реализовать метод:

private void doCountButtonAction(ActionEvent e) {
   // do whatever you need to here
   // using "this" here refers to the containing class (i.e. JFrame, JPanel or whatever)
}
1 голос
/ 15 сентября 2011

Ваш вопрос не совсем о слушателях, а о том, как работают интерфейсы и как вы можете создать экземпляр класса в Java.Вот некоторые тонкости:

  1. По сути, класс JButton предлагает вам способ объявить класс, для которого будет вызываться один конкретный метод, когда событие вызывается на кнопке, например, при нажатии на нее,Если вы посмотрите на Javadocs для JButton и ActionListener, вы теперь узнаете, как они работают:

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/AbstractButton.html#addActionListener(java.awt.event.ActionListener)

http://download.oracle.com/javase/1.4.2/docs/api/java/awt/event/ActionListener.html

Что вы можете сделать здесьсамым старомодным способом является создание класса, который будет срабатывать, когда кто-то нажимает на вашу кнопку:

public class MyButtonActionListener implements ActionListener {

actionPerformed(ActionEvent e) {    
    System.out.println("Aww, you clicked!");    
    }
}

Теперь, как только это будет сделано, вы можете сделать это и добавить его в качестве слушателя.на вашу кнопку:

JButton button = new JButton("My button");

MyButtonActionListener myActionListener = new MyButtonActionListener ();button.addActionListener (myActionListener);

С другой стороны, в Java вы можете создать экземпляр класса anonimousy, что означает, что вместо того, чтобы иметь обработчик для его экземпляра (как myActionListener в приведенном выше коде), вы просто создаете экземплярна лету в нужном вам месте, и у вас не будет обработчика, чтобы использовать его позже.Вот что происходит в вашем коде: реализация ActionListener на лету отключается в качестве параметра для метода addActionListener, который в объявлении fly также включает в себя утверждение, что ваш анонимный экземпляр - это не просто какой-либо класс, а тот, который реализует ActionListener, и тому подобное.Ваше анонимное объявление должно дать реализацию метода actionPerformed.

Третий вариант - иметь класс, реализующий ActionListener (и метод actionPerformed), и внутри этого класса, если вы создаете JButton и хотитечтобы передать его в качестве слушателя экземпляр класса ecompasing, вы будете использовать this для обозначения этого, например:

public class MyButtonActionListener implements ActionListener {

private JButton button = new JButton();


public void init() {
    button.addActionListener(this);
}

public actionPerformed(ActionEvent e) {
    System.out.println("u clicked!");
    }
}

В этом обсуждении есть много более тонких моментов (как в том, как выОбратитесь к «this» на анонимном классе, разделенном внутри другого класса, и как вы ссылаетесь на «this» экземпляра охватывающего класса).Я рекомендую вам прочитать книгу о сертификации Sun Certified Java Programmer, в ней есть глава, посвященная этому

0 голосов
/ 15 сентября 2011

Он работает так же, как и первый метод, т. Е. Метод ожидает объект, который реализует интерфейс ActionListener.Однако оба метода имеют свои достоинства и недостатки.Первый метод позволяет использовать один объект за счет загроможденного кода if / else, поскольку один и тот же метод будет обрабатывать события для нескольких кнопок.Второй метод позволяет более четко разделить логику для каждой кнопки за счет создания нескольких анонимных объектов (для каждой кнопки).

0 голосов
/ 15 сентября 2011

В любом случае, чтобы добавить ActionListener, вам нужен класс, который реализует интерфейс ActionListener (который определяет один метод, actionPerformed).addActionListener(this) подразумевает, что this реализует этот интерфейс, и любое выполненное действие вызовет this.actionPerformed.

Во втором случае вы создаете новый анонимный класс, который реализует ActionListenerинтерфейс.При щелчке countButton вызывается метод actionPerformed в анонимном классе.

0 голосов
/ 15 сентября 2011

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

...