2012-07-22 59 views
0

所以,我知道类似的问题已经被回答了,但是我的更具体一些。我正在写一个简单的程序来比较两个输入的单词,然后告诉你它们是否匹配。下面是代码:在另一个类中使用ActionListener

import javax.swing.*; 
import java.awt.BorderLayout; 
import java.awt.FlowLayout; 
import java.awt.GridLayout; 

public class Password { 
JPanel windowContent, p1, p2, p3; //p1 is in the west, p2 in center and p3 in south 
JButton check, clear; 
JTextField pass1, pass2; 
JLabel word1, word2, result; 
JFrame frame; 


Password() { 
    windowContent = new JPanel(); 
    BorderLayout bl = new BorderLayout(); 
    windowContent.setLayout(bl); 

    p1 = new JPanel(); 
    GridLayout gl = new GridLayout(2, 1); 
    p1.setLayout(gl); 

    word1 = new JLabel("1st word: "); 
    word2 = new JLabel ("2nd word: "); 

    p1.add(word1); 
    p1.add(word2); 

    windowContent.add("West", p1); 

    p2 = new JPanel(); 
    p2.setLayout(gl); 

    pass1 = new JTextField (20); 
    pass2 = new JTextField (20); 

    p2.add(pass1); 
    p2.add(pass2); 

    windowContent.add("Center", p2); 

    p3 = new JPanel(); 
    FlowLayout fl = new FlowLayout(); 
    p3.setLayout(fl); 

    check = new JButton("Check"); 
    clear = new JButton("Clear"); 
    result = new JLabel(""); 

    p3.add(check); 
    p3.add(result); 
    p3.add(clear); 

    windowContent.add("South", p3); 

    frame = new JFrame("Password"); 
    frame.add(windowContent); 
    frame.pack(); 
    frame.setVisible(true); 

    PasswordEngine engine = new PasswordEngine(this); // <--- THIS LINE HERE! 

    check.addActionListener(engine); 
    clear.addActionListener(engine); 

    } 

    public static void main(String [] args) { 
     Password pass = new Password(); 

    } 

} 

而在另一大类程序逻辑:

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

public class PasswordEngine implements ActionListener { 

Password parent; 
String textField1, textField2; 

PasswordEngine(Password parent) { 
    this.parent = parent; 
} 

public void actionPerformed(ActionEvent e) { 
    String displayFieldText1 = parent.pass1.getText(); 
    String displayFieldText2 = parent.pass2.getText(); 

    Object src = e.getSource(); 

    if (src == parent.clear) { 
     parent.pass1.setText(""); 
     parent.pass2.setText(""); 
     parent.result.setText(""); 
     parent.pass1.setBackground(Color.white); 
     parent.pass2.setBackground(Color.white); 
    } else if (displayFieldText1.equals(displayFieldText2)) { 
     parent.result.setText("MATCH"); 
     parent.pass1.setBackground(Color.GREEN); 
     parent.pass2.setBackground(Color.GREEN); 
    } else { 
     parent.result.setText("NOT MATCH"); 
     parent.pass1.setBackground(Color.white); 
     parent.pass2.setBackground(Color.white); 

    } 

} 

} 

所以,我的问题是关于Password类,在这一行:

PasswordEngine engine = new PasswordEngine(this); 

为什么this一个参数?为什么该行实际需要一个参数? 我不明白为什么this它需要在那里。

P.S .:我是Java和编程新手。

回答

0

PasswordEngine类有一个构造函数,这需要Password类型的参数:

PasswordEngine(Password parent) { 

所以每当你说new Password(…)那么......必须correspont到Password类型的对象(一般可能null,但那会在稍后导致问题)。并且,由于该参数用于描述将应用该操作的密码窗口小部件,因此密码窗口小部件将自己进行访问(请参阅this)作为该参数。这样,PasswordEngine知道哪个对象创建了它。

注意许多应用程序将使用嵌套类进行此操作。嵌套类可以访问其封闭类的成员,因此parent的显式处理不是必需的。

相关问题