我正在编写一个程序,然后我在一些使用此代码中的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()));
}
}
}
答案 0 :(得分:6)
你正在寻找内心阶级。在这种情况下,甚至有几个版本的this
。
普通this
将是内部类的实例(即TextHandler)。如果需要引用包含类的实例,则必须使用类名TextPassWordEvent.this
对其进行限定。
答案 1 :(得分:1)
在代码段中使用this
是指构建时的活动对象;即TextPasswordEvent
类的实例
答案 2 :(得分:1)
在java中,这指的是当前的对象实例 在上面的示例中,使用“this”的位置是内部类中的某些代码。如果此代码使用'this'而没有任何上下文,那么它将引用内部类的实例。
Java提供了OuterClassName.this的表示法,作为引用此内部类实例化的外部类的实例的方法。
所以它只是引用TextPasswordEvent类的实例。
TextPasswordEvent是一个容器,在调用showMessageDialogue时,您需要传递一个容器,在该容器中将显示该对话框,因此TextPasswordEvent.this将“将TextPasswordEvent对象的实例传递给showMessageDialogue方法”。如果它没有使用限定条件并且只是传递了“this”,那么它将传递对TextHandler内部类实例的引用,而不是所期望的行为。
编辑:更多信息
TextHandler是一个实现ActionListener接口的内部类。在此接口中,有一个名为actionPerformed的方法。
外部类正在创建各种控件(按钮,文本字段等),然后创建TextHandler类的一个实例并将其设置为这些控件上的动作侦听器。然后,当用户点击按钮或返回键(取决于控件)时,这些控件将调用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);
答案 3 :(得分:0)
this
始终是对象当前实例的引用。
答案 4 :(得分:0)
这意味着你指的是当前的背景。
这意味着TextHandler类中的当前上下文是ActionListener就是这个
对于每个事件我们都需要一个监听器来执行操作,所以在extPassWordEvent事件中,ActionListener是需要触发的监听器...........