我正在编写一个程序,然后我在某个网站上看到这个代码中使用 this 关键字,我想知道它的目的是什么,它可以处理 Jbutton 或 JTextField,它可以使用 this 关键字显示消息, getSource() 怎么了?

这是代码

import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JFrame;
import javax.swing.JPasswordField;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;

public class TextPassWordEvent extends JFrame {

    private JTextField textField1;
    private JTextField textField2;
    private JTextField textField3;
    private JPasswordField passwordField;
    private JButton button;

    public TextPassWordEvent(){
        super("Title");
        setLayout(new FlowLayout());

        textField1 = new JTextField(10);
        add(textField1);

        textField2 = new JTextField("Enter your Text Here");
        add(textField2);

        textField3 = new JTextField("Uneditable Text field");
        textField3.setEditable(false);
        add(textField3);

        passwordField = new JPasswordField("Password");
        add(passwordField);

        button = new JButton("Submit");
        add(button);

        TextHandler handler = new TextHandler();
        textField1.addActionListener(handler);
        textField2.addActionListener(handler);
        textField3.addActionListener(handler);
        passwordField.addActionListener(handler);
        button.addActionListener(handler);
    }

    private class TextHandler implements ActionListener{

        public void actionPerformed(ActionEvent event){
            JOptionPane.showMessageDialog(TextPassWordEvent.this, String.format("Message: %s",event.getActionCommand()));
        }
    }

}

最佳答案

在 java 中 this 指的是当前对象实例。
在上面的示例中,使用“this”的地方是在内部类中的某些代码中。如果这段代码在没有任何上下文的情况下使用了“this”,那么它将引用内部类的实例。

Java 提供了 OuterClassName.this 的表示法,作为引用内部类实例化所在的外部类实例的一种方式。

所以它只是引用 TextPasswordEvent 类的实例。

TextPasswordEvent 是一个容器,在调用 showMessageDialogue 时,您需要传递一个将在其中显示对话框的容器,因此 TextPasswordEvent.this 表示“将 TextPasswordEvent 对象的实例传递给 showMessageDialogue 方法”。如果它不使用限定并且只是传递“this”,它将传递对 TextHandler 内部类实例的引用,而不是所需的行为。

编辑:更多信息

TextHandler 是一个实现 ActionListener 接口(interface)的内部类。在这个接口(interface)中定义了一个名为 actionPerformed 的方法。

外部类正在创建各种控件(按钮、文本字段等),然后创建 TextHandler 类的一个实例并将其设置为这些控件上的 Action 监听器。当用户点击按钮或返回键(取决于控件)时,这些控件会调用 actionPerformed 方法。

在内部类的 actionPerformed 方法中,它显示一个对话框 (showMessageDialogue) 并传递两个参数 - 显示内部对话框的容器和显示在其中的消息。

它显示的消息包括传递的命令。这是通过对传递给 actionPerformed() 方法的 ActionEvent 对象调用 getActionCommand() 获得的。在用户完成操作(按下按钮、按下返回键等)后,控件在调用 actionPerformed 时创建并传递此 ActionEvent 对象。

编辑2:

为另一个只会添加到按钮组件的 ActionListener 添加一个新的内部类定义:

private class MyButtonHandler implements ActionListener{

    public void actionPerformed(ActionEvent event){
        JOptionPane.showMessageDialog(TextPassWordEvent.this, "This only gets shown when the button gets pressed because I only added an instance of this action listener to button and none of the other components");
    }
}

然后回到 TextPassWordEvent 构造函数代码:
TextHandler handler = new TextHandler();
textField1.addActionListener(handler);
textField2.addActionListener(handler);
textField3.addActionListener(handler);
passwordField.addActionListener(handler);

// Create an instance of our button handler and add that to our button instead of the
// other handler.
MyButtonHandler buttonHandler = new MyButtonHandler();
button.addActionListener(buttonHandler);

关于java - "this"在这个程序中是什么意思?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8221782/

10-16 22:07