Это очень большая проблема с переменной областью действия.
В настоящее время текстовое поле и кнопка находятся в области действия метода main
, поэтому наличие отдельного класса для ActionListener
будет означать, что у него не будет доступа к этим переменным.
Есть несколько способов добиться этого:
(1) Создайте внутренний класс ListenerClass
в MyClass
и превратите 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("");
}
}
Вероятно, есть еще способы достичь этого, и, возможно, есть более эффективные способы реализации этого. Выбор того, какой подход вы выберете, действительно зависит от желаемого дизайна приложения.