2015-09-18 2 views
0

Скажем, у меня есть класс XFrame, который расширяет JFrame и реализует ActionListener. В классе у меня есть JButton b, и я переопределяю метод actionPerformed. Теперь в конструкторе я должен установить b.addActionListener (this). Мой вопрос: что это делает в этом случае и что я могу заменить? Я попробовал b.addActionListener (новый XFrame()), но это не сработало.Что я могу использовать в java для addActionListener (this) вместо «this»?

+0

Вы можете создать экземпляр ActionListener вместо этого. например, новый ActionListener() { public void actionПерформированный (ActionEvent ae) {}); –

+1

Это означает, что это означает в любом другом случае - Ссылка на текущий объект –

+0

Вы можете передать любой экземпляр, как и любой другой вызов функции. Какая у вас проблема? – SLaks

ответ

0

Посмотрите на this (предназначенная для каламбура) статья. Кроме того, еще один способ сделать это таким образом:

ActionListener e = new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent arg0) { 
      // TODO Auto-generated method stub 
     } 
}; 
b.add(e); 
1

Попробуйте анонимный класс:

public class Test { 

    public static void main(final String[] args) { 
     final JFrame frame = new JFrame(); 
     final JButton button = new JButton("Test"); 
     button.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(final ActionEvent e) { 
       System.out.println("pressed"); 
      } 
     }); 

     frame.getContentPane().add(button); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

Или, если вы хотите, чтобы ваш JFrame реализовать ActionListener вместо того, чтобы использовать анонимный класс, см this example , В этом случае this будет ссылаться на экземпляр JFrame.

1

Что вы подразумеваете под "это не сработало". Я ожидаю, что он будет компилироваться, но это не то, что вы ожидали. Это нормально, потому что вы говорите качели, что actionListener не тот, который был получен XFrame, который получил событие, но actionlistener, связанный с другим XFrame (новый параметр XFrame()). Этот другой XFrame может даже не отображаться на экране! Поэтому не ожидайте ничего увидеть;)

Чтобы ответить на ваш вопрос, вы можете заменить «это» любым экземпляром ActionListener. Ваш XFrame, по-видимому, является одним из «этого». Но вы можете заменить его любым другим создателем ActionListener, созданным где-либо еще. Будет отправлено уведомление о действии. Но важно то, что этот ActionListener должен сделать что-то интересное (видимое!) После уведомления. И «новый XFrame()» не может, поскольку он не отображается на экране! Только текущее отображение на экране XFrame.

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

1

Что делает «это» в этом случае ...?

The this передается b.addActionListener(this) говорит кнопку он должен вызвать actionPerformed метод this объекта (т.е., который является экземпляром Xframe) всякий раз, когда действие кнопки запускается (т.е. кнопка нажата).

что я могу заменить?

Вы можете заменить его другим объектом, который реализует интерфейс ActionListener. Часто это делается через «анонимный» класс, как для otherActionListener в приведенном ниже примере.

Еще одна приятная вещь: вы можете не только заменить «this» на другой объект ActionListener, вы можете добавить к нему еще несколько объектов ActionListener. Например. в следующем примере я добавил экземпляр XFrame (this) и otherActionListener. При нажатии кнопки будут выполняться методы actionPerformed обоих объектов.

Вот полный пример:

import static javax.swing.JOptionPane.showMessageDialog; 

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

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class XFrame extends JFrame implements ActionListener { 
    JButton b = new JButton("Click me"); 

    ActionListener otherActionListener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      showMessageDialog(XFrame.this, "The other action says: 'Hi'"); 
     } 
    }; 

    public XFrame() { 
     getContentPane().add(b); 

     b.addActionListener(this); 

     b.addActionListener(otherActionListener); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     showMessageDialog(this, "XFrame says: 'hello'"); 
    } 

    public static void main(String[] args) { 
     XFrame frame = new XFrame(); 
     frame.setSize(100,60); 
     frame.setVisible(true); 
    } 
} 
Смежные вопросы