这在很大程度上是一个变量范围问题。
目前,文本字段和按钮在 main 方法的范围内,因此为 ActionListener 提供一个单独的类将意味着它无法访问这些变量。
有几种方法可以实现这一点:
(1)在MyClass中创建一个内部类ListenerClass,并将myTextField和myTextFieldSubmit变成MyClass的实例字段。
public class MyClass
{
final static JTextField myTextField = new JTextField(10);
final static JButton myTextFieldSubmit = new JButton("Submit");
public static void main(String args[])
{
myTextFieldSubmit.addActionListener(new ListenerClass());
}
static class ListenerClass implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
myTextField.setText("");
}
}
}
(2) 在main 方法中创建一个匿名内部类,这将允许myTextField 和myTextFieldSubmit 保持在同一个位置,只要它们被声明为final。
public class MyClass
{
public static void main(String args[])
{
final JTextField myTextField = new JTextField(10);
final JButton myTextFieldSubmit = new JButton("Submit");
myTextFieldSubmit.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e)
{
myTextField.setText("");
}
});
}
}
(3) 创建一个本地类,该类是main 方法的本地类。同样,这将要求将文本字段和按钮声明为 final 以允许从内部类进行访问。
public class MyClass
{
public static void main(String args[])
{
final JTextField myTextField = new JTextField(10);
final JButton myTextFieldSubmit = new JButton("Submit");
class ListenerClass implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
myTextField.setText("");
}
}
myTextFieldSubmit.addActionListener(new ListenerClass());
}
}
(4) 处理对ListenerClass 的引用,例如在构造函数中,同时使myTextField 和myTextFieldSubmit 成为实例变量。
public class MyClass
{
JTextField myTextField = new JTextField(10);
JButton myTextFieldSubmit = new JButton("Submit");
public MyClass()
{
myTextFieldSubmit.addActionListener(new ListenerClass(this));
}
public static void main(String args[])
{
new MyClass();
}
}
class ListenerClass implements ActionListener
{
MyClass myClass;
public ListenerClass(MyClass myClass)
{
this.myClass = myClass;
}
public void actionPerformed(ActionEvent e)
{
myClass.myTextField.setText("");
}
}
(5) 将myTextField 和myTextFieldSubmit 设为static 字段,并允许从ListerClass 直接访问。
public class MyClass
{
static JTextField myTextField = new JTextField(10);
static JButton myTextFieldSubmit = new JButton("Submit");
public static void main(String args[])
{
myTextFieldSubmit.addActionListener(new ListenerClass());
}
}
class ListenerClass implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
MyClass.myTextField.setText("");
}
}
可能还有更多方法可以实现这一点,并且可能有更好的方法来实现这一点。选择哪种方法实际上取决于所需的应用程序设计。