将 "this" 作为方法参数传递 - 说明
Passing "this" as a Method Argument - Clarification
在 Java 完成我的第一套课程后,我目前正在学习 Java 秋千课。在本课中,我们正在研究我们一直在研究的不同组件(按钮、工具栏等)之间的通信。问题是,"this" 作为方法参数传递给 addActionListener() 方法。这有效,但是,我不完全理解它在做什么。我做了一些关于 "this," 的研究,发现 "this" 关键字最流行的用法是在具有相同名称变量的构造函数中。我找不到适合我的例子。通过查看下面的代码,我将解释我理解的部分代码。
import java.awt.FlowLayout; Implements FlowLayout class
import java.awt.event.ActionEvent; //Imports ActionEvent Class
import java.awt.event.ActionListener; //Imports ActionListener Interface
import javax.swing.JButton; //Imports JButton class
import javax.swing.JPanel; //Imports JPanel class
public class Toolbar extends JPanel implements ActionListener {
// ^ Inherits JPanel & Implements ActionListener Interface
private JButton helloButton; //Creating variable of JButton type
private JButton goodbyeButton; //Creating variable of JButton type
public Toolbar() { //Constructor
helloButton = new JButton("Hello"); //Creates new JButton
goodbyeButton = new JButton("Goodbye"); //Creates new JButton
helloButton.addActionListener(this); //Question 1
goodbyeButton.addActionListener(this); //Question 1
setLayout(new FlowLayout(FlowLayout.LEFT)); //Sets Layout Type to Left
add(helloButton); //Adds button to FlowLayout (Layout Manager) Interface
add(goodbyeButton); //Adds button to FlowLayout (Layout Manager) Interface
}
public void setTextPanel(TextPanel textPanel) {
//No Usage Yet!
}
public void actionPerformed(ActionEvent arg0) { //Unimplemented Method from ActionListener
System.out.println("A button was clicked"); //Prints after button is clicked.
}
}
问题 1: 如您所见,在创建了两个 JButton 之后,我们添加了一个 addActionListener() 方法来检测按钮是否被单击。如果它已被单击,那么它将执行从 ActionListener 接口实现的 actionPerformed 中键入的任何代码。在之前的课程中,我们用不同的方式让按钮响应点击。它做了同样的事情,但它看起来像这样:
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
textPanel.appendText("Hello\n");
}
});
在此示例中,我们没有打印到控制台来测试 actionListener() 是否有效,而是将文本附加到自定义组件的文本区域。在本文正上方的代码中,我们正在使用匿名 class.
所以...问题是,"this" 在作为方法参数传递给 addActionListener() 时究竟在做什么?我知道它正在向控制台打印 "A button was clicked",但我不明白 "this" 将已单击按钮发送到 actionPerformed() 的背后逻辑。
这是应用程序的样子:
这是正在运行的应用程序,按钮在单击后已打印到控制台。我想这可能会让你更好地了解我在做什么。我希望有人可以阐明这一点,并解释 "this" 在这种情况下是如何工作的。谢谢!
通过实现 ActionListener
然后将 this
传递给 addActionListener
方法,您要求了解通过调用 actionPerformed
方法执行的任何操作.
或者,更简单地说,您给按钮您的 phone 号码,并要求它在有事发生时给您打电话。
在前面的课程中,您说明了应该发生的情况 - 打印此文本或向 textPanel 添加一些文本。为此,您正在即时制作 ActionListener
。现在您自己实现了 ActionListener
,您可以向 you 请求回调,而不是让一个监听器处于运行状态。
swing
组件的 addActionListener
方法采用 ActionListener
类型的参数。实现 ActionListener
的 class 包含指定当有人与 swing
组件交互时应该做什么的代码。
当您将 this
传递给 addActionListener
方法时,您传递的是对正在实例化的当前对象的引用。碰巧,正在实例化的当前对象也是一个 ActionListener
(因为它实现了 ActionListener
),因此可以传递给 addActionListener
方法。
当您在 GUI 中与 JButton
交互时,Toolbar
class 的 actionPerformed
方法将被调用,因为那是 ActionListener
你用 JButton
注册了
this
只是您的 Toolbar
class 的一个实例。它在实例方法中用于表示当前实例。基本上你可以想象你的 class 有另一个名为 this
的私有成员变量,它指向一个 Toolbar
对象。
由于 Toolbar
实现了 ActionListener
,您将新实例化的 Toolbar
对象指定为按钮的侦听器(这意味着 Toolbar.actionPerformed()
方法将在按钮时被调用被点击。)
this 表示您的 class.
的当前实例
Toolbar class实现了ActionListener接口,也就是说它提供了actionPerformed.
方法的实现
因此,helloButton.addActionListener(this);
成为可能(尝试从 class 声明中删除 implements ActionListener,代码将无法编译)。
这么说,Toolbar 实例可以被视为 ActionListener 对象,可以传递给 button.addActionListener。
使用时
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
}
}
您创建了 ActionListener 接口的新实现 即时 。这种实现被命名为anonymous.
两种解决方案均有效。如果无法从其他地方使用 actionPerformed 中的代码,则首选匿名解决方案。
这两个例子会做同样的事情(假设所有导入都在那里,并且大写是正确的):
public static void main(String args[]){
myFrame frame = new myFrame();
myFrame.addActionListener(new myListener);
}
public myFrame extends JFrame{
public myFrame(){
super("myFrame");
}
}
public myListener implements ActionListener{
public void ActionPerformed(ActionEvent e){
//Do Stuff
}
}
和
public static void main(String args[]){
myFrame frame = new myFrame();
}
public myFrame extends JFrame implements ActionListener{
public myFrame(){
super("myFrame");
this.add(this);
}
public void ActionPerformed(ActionEvent e){
//Do Stuff
}
}
将 ActionListener
设置为 this
的优点是,如果您想在方法 private
上添加修饰符,它可以更直接地访问字段和方法。
但是,如果你想避免 if/else if 处理多个按钮的怪物,我建议使用单独的 ActionListener(并提供一种方法来改变需要改变的东西),或者看看匿名 类 和 lambda 表达式。
通常在面向对象的编码中,值得扮演您正在编码的 class 对象的角色。如果你这样做,"this" 意味着 "me".
并且因为 Java 是传递引用,所以 "this" 是指向 "me" 的箭头。
public class Foo implements ActionListener {
public void actionPerformed(ActionEvent e) {
// do something useful with e
}
}
这里我们写了一个classFoo
。因为我们已经说过它实现了 ActionListener,所以它必须有一个 actionPerformed()
方法。任何东西都可以这样称呼:
ActionListener listener = new Foo(...);
ActionEvent event = ...;
foo.actionPerformed(event);
我们可以创建一个 Foo
并将其提供给生成事件的对象:
ActionListener listener = new Foo(...);
button.addListener(listener);
如果我们对对象进行角色扮演,您可以将最后一行视为 "Hey button
! Tell listener
whenever an action happens."。
现在,如果我们希望听者自己控制谁告诉它什么,该怎么办? "Hey button
, tell me whenever an action happens".
public class Foo implements ActionListener {
public attachToButton(JButton button) {
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
// do something useful with e
}
}
想象一下按钮的 addActionListener 代码可能是什么样的:
public class JButton { // not the real JButton code, but it will be similar
private List<ActionListener> actionListeners = new ArrayList<ActionListener>();
public void addActionListener(ActionListener a) {
actionListeners.add(a);
}
// called internally when an event happens
private void onEvent(ActionEvent e) {
for(ActionListener listener : actionListeners) {
listener.actionPerformed(e);
}
}
}
因此,如果您是调用 addActionListener(this)
的侦听器,那么该列表包含一个直接指向您的引用,每次动作发生时按钮都会用它来拍打您的肩膀。
在 Java 完成我的第一套课程后,我目前正在学习 Java 秋千课。在本课中,我们正在研究我们一直在研究的不同组件(按钮、工具栏等)之间的通信。问题是,"this" 作为方法参数传递给 addActionListener() 方法。这有效,但是,我不完全理解它在做什么。我做了一些关于 "this," 的研究,发现 "this" 关键字最流行的用法是在具有相同名称变量的构造函数中。我找不到适合我的例子。通过查看下面的代码,我将解释我理解的部分代码。
import java.awt.FlowLayout; Implements FlowLayout class
import java.awt.event.ActionEvent; //Imports ActionEvent Class
import java.awt.event.ActionListener; //Imports ActionListener Interface
import javax.swing.JButton; //Imports JButton class
import javax.swing.JPanel; //Imports JPanel class
public class Toolbar extends JPanel implements ActionListener {
// ^ Inherits JPanel & Implements ActionListener Interface
private JButton helloButton; //Creating variable of JButton type
private JButton goodbyeButton; //Creating variable of JButton type
public Toolbar() { //Constructor
helloButton = new JButton("Hello"); //Creates new JButton
goodbyeButton = new JButton("Goodbye"); //Creates new JButton
helloButton.addActionListener(this); //Question 1
goodbyeButton.addActionListener(this); //Question 1
setLayout(new FlowLayout(FlowLayout.LEFT)); //Sets Layout Type to Left
add(helloButton); //Adds button to FlowLayout (Layout Manager) Interface
add(goodbyeButton); //Adds button to FlowLayout (Layout Manager) Interface
}
public void setTextPanel(TextPanel textPanel) {
//No Usage Yet!
}
public void actionPerformed(ActionEvent arg0) { //Unimplemented Method from ActionListener
System.out.println("A button was clicked"); //Prints after button is clicked.
}
}
问题 1: 如您所见,在创建了两个 JButton 之后,我们添加了一个 addActionListener() 方法来检测按钮是否被单击。如果它已被单击,那么它将执行从 ActionListener 接口实现的 actionPerformed 中键入的任何代码。在之前的课程中,我们用不同的方式让按钮响应点击。它做了同样的事情,但它看起来像这样:
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
textPanel.appendText("Hello\n");
}
});
在此示例中,我们没有打印到控制台来测试 actionListener() 是否有效,而是将文本附加到自定义组件的文本区域。在本文正上方的代码中,我们正在使用匿名 class.
所以...问题是,"this" 在作为方法参数传递给 addActionListener() 时究竟在做什么?我知道它正在向控制台打印 "A button was clicked",但我不明白 "this" 将已单击按钮发送到 actionPerformed() 的背后逻辑。
这是应用程序的样子:
这是正在运行的应用程序,按钮在单击后已打印到控制台。我想这可能会让你更好地了解我在做什么。我希望有人可以阐明这一点,并解释 "this" 在这种情况下是如何工作的。谢谢!
通过实现 ActionListener
然后将 this
传递给 addActionListener
方法,您要求了解通过调用 actionPerformed
方法执行的任何操作.
或者,更简单地说,您给按钮您的 phone 号码,并要求它在有事发生时给您打电话。
在前面的课程中,您说明了应该发生的情况 - 打印此文本或向 textPanel 添加一些文本。为此,您正在即时制作 ActionListener
。现在您自己实现了 ActionListener
,您可以向 you 请求回调,而不是让一个监听器处于运行状态。
swing
组件的 addActionListener
方法采用 ActionListener
类型的参数。实现 ActionListener
的 class 包含指定当有人与 swing
组件交互时应该做什么的代码。
当您将 this
传递给 addActionListener
方法时,您传递的是对正在实例化的当前对象的引用。碰巧,正在实例化的当前对象也是一个 ActionListener
(因为它实现了 ActionListener
),因此可以传递给 addActionListener
方法。
当您在 GUI 中与 JButton
交互时,Toolbar
class 的 actionPerformed
方法将被调用,因为那是 ActionListener
你用 JButton
注册了
this
只是您的 Toolbar
class 的一个实例。它在实例方法中用于表示当前实例。基本上你可以想象你的 class 有另一个名为 this
的私有成员变量,它指向一个 Toolbar
对象。
由于 Toolbar
实现了 ActionListener
,您将新实例化的 Toolbar
对象指定为按钮的侦听器(这意味着 Toolbar.actionPerformed()
方法将在按钮时被调用被点击。)
this 表示您的 class.
的当前实例Toolbar class实现了ActionListener接口,也就是说它提供了actionPerformed.
方法的实现因此,helloButton.addActionListener(this);
成为可能(尝试从 class 声明中删除 implements ActionListener,代码将无法编译)。
这么说,Toolbar 实例可以被视为 ActionListener 对象,可以传递给 button.addActionListener。
使用时
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
}
}
您创建了 ActionListener 接口的新实现 即时 。这种实现被命名为anonymous.
两种解决方案均有效。如果无法从其他地方使用 actionPerformed 中的代码,则首选匿名解决方案。
这两个例子会做同样的事情(假设所有导入都在那里,并且大写是正确的):
public static void main(String args[]){
myFrame frame = new myFrame();
myFrame.addActionListener(new myListener);
}
public myFrame extends JFrame{
public myFrame(){
super("myFrame");
}
}
public myListener implements ActionListener{
public void ActionPerformed(ActionEvent e){
//Do Stuff
}
}
和
public static void main(String args[]){
myFrame frame = new myFrame();
}
public myFrame extends JFrame implements ActionListener{
public myFrame(){
super("myFrame");
this.add(this);
}
public void ActionPerformed(ActionEvent e){
//Do Stuff
}
}
将 ActionListener
设置为 this
的优点是,如果您想在方法 private
上添加修饰符,它可以更直接地访问字段和方法。
但是,如果你想避免 if/else if 处理多个按钮的怪物,我建议使用单独的 ActionListener(并提供一种方法来改变需要改变的东西),或者看看匿名 类 和 lambda 表达式。
通常在面向对象的编码中,值得扮演您正在编码的 class 对象的角色。如果你这样做,"this" 意味着 "me".
并且因为 Java 是传递引用,所以 "this" 是指向 "me" 的箭头。
public class Foo implements ActionListener {
public void actionPerformed(ActionEvent e) {
// do something useful with e
}
}
这里我们写了一个classFoo
。因为我们已经说过它实现了 ActionListener,所以它必须有一个 actionPerformed()
方法。任何东西都可以这样称呼:
ActionListener listener = new Foo(...);
ActionEvent event = ...;
foo.actionPerformed(event);
我们可以创建一个 Foo
并将其提供给生成事件的对象:
ActionListener listener = new Foo(...);
button.addListener(listener);
如果我们对对象进行角色扮演,您可以将最后一行视为 "Hey button
! Tell listener
whenever an action happens."。
现在,如果我们希望听者自己控制谁告诉它什么,该怎么办? "Hey button
, tell me whenever an action happens".
public class Foo implements ActionListener {
public attachToButton(JButton button) {
button.addActionListener(this);
}
public void actionPerformed(ActionEvent e) {
// do something useful with e
}
}
想象一下按钮的 addActionListener 代码可能是什么样的:
public class JButton { // not the real JButton code, but it will be similar
private List<ActionListener> actionListeners = new ArrayList<ActionListener>();
public void addActionListener(ActionListener a) {
actionListeners.add(a);
}
// called internally when an event happens
private void onEvent(ActionEvent e) {
for(ActionListener listener : actionListeners) {
listener.actionPerformed(e);
}
}
}
因此,如果您是调用 addActionListener(this)
的侦听器,那么该列表包含一个直接指向您的引用,每次动作发生时按钮都会用它来拍打您的肩膀。