Скажем, у меня есть класс XFrame, который расширяет JFrame и реализует ActionListener. В классе у меня есть JButton b, и я переопределяю метод actionPerformed. Теперь в конструкторе я должен установить b.addActionListener (this). Мой вопрос: что это делает в этом случае и что я могу заменить? Я попробовал b.addActionListener (новый XFrame()), но это не сработало.Что я могу использовать в java для addActionListener (this) вместо «this»?
ответ
Посмотрите на this (предназначенная для каламбура) статья. Кроме того, еще один способ сделать это таким образом:
ActionListener e = new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO Auto-generated method stub
}
};
b.add(e);
Попробуйте анонимный класс:
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
.
Что вы подразумеваете под "это не сработало". Я ожидаю, что он будет компилироваться, но это не то, что вы ожидали. Это нормально, потому что вы говорите качели, что actionListener не тот, который был получен XFrame, который получил событие, но actionlistener, связанный с другим XFrame (новый параметр XFrame()). Этот другой XFrame может даже не отображаться на экране! Поэтому не ожидайте ничего увидеть;)
Чтобы ответить на ваш вопрос, вы можете заменить «это» любым экземпляром ActionListener. Ваш XFrame, по-видимому, является одним из «этого». Но вы можете заменить его любым другим создателем ActionListener, созданным где-либо еще. Будет отправлено уведомление о действии. Но важно то, что этот ActionListener должен сделать что-то интересное (видимое!) После уведомления. И «новый XFrame()» не может, поскольку он не отображается на экране! Только текущее отображение на экране XFrame.
В сложной системе вы, как правило, не хотите, чтобы ваш кадр также был одним из событий обработки, потому что вы хотите отделить понятия. Но в простых программах, которые вы выполняете при изучении Java, обычно проще визуально видеть обратную связь, отображаемую отображаемым фреймом, при нажатии кнопки.
Что делает «это» в этом случае ...?
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);
}
}
- 1. Java ".addActionListener (this)"
- 2. Java addActionListener (this) создает ошибку
- 3. 'this' в контексте addActionListener
- 4. Что я могу использовать вместо «this» в качестве передающего аргумента?
- 5. Что означает «это» ключевое слово в Java .addActionListener (this) »
- 6. использовать $ (this) вместо selector
- 7. Почему я могу использовать 'this' в методах
- 8. this = this in decompiled Java
- 9. Где использовать "this" в java?
- 10. $ (this) вместо ввода
- 11. Как я могу ссылаться на свойство `this` внутри метода` this`?
- 12. Могу ли я использовать что-то другое вместо «this» в этом коде?
- 13. Что такое присваивание * this do (* this = val)?
- 14. Java: проблемы с ключевым словом this this
- 15. Как использовать jquery this
- 16. Почему я не могу использовать `this` для общего типа?
- 17. Как правильно использовать $ (this)
- 18. Что означает $ (this) для javascript?
- 19. Когда использовать ключевое слово 'this' в Java?
- 20. Что означает метод this()?
- 21. Могу ли я использовать $ (this) в вызове jquery.data()?
- 22. Зачем использовать this-> ObjectName вместо this.ObjectName в C++
- 23. Компиляция $ (this) as $ (_ this)
- 24. addactionListener (this) Как правильно разместить эту строку кода?
- 25. Что такое указатель 'this'?
- 26. Невозможно использовать $ this в jQuery
- 27. Методы метода: this & this
- 28. Как я могу использовать $ (this) внутри события onComplete Fancybox?
- 29. Java 'this' keyword
- 30. C# this [] Свойство в Java
Вы можете создать экземпляр ActionListener вместо этого. например, новый ActionListener() { public void actionПерформированный (ActionEvent ae) {}); –
Это означает, что это означает в любом другом случае - Ссылка на текущий объект –
Вы можете передать любой экземпляр, как и любой другой вызов функции. Какая у вас проблема? – SLaks