이것은 매우 다양한 범위 문제입니다.
현재 텍스트 필드와 버튼은 main
메서드의 범위에 있으므로 ActionListener
에 대한 별도의 클래스를 사용하면 해당 변수에 액세스 할 수 없습니다.
이를 달성하기 위해 몇 가지 방법이 있습니다 :
는
(1) MyClass
에서 내부 클래스 ListenerClass
을 확인하고 MyClass
의 인스턴스 필드에 myTextField
및 myTextFieldSubmit
을 켜십시오.
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
방법에 익명의 내부 클래스를 확인하고이 그들이 final
을 선언으로 myTextField
및 myTextFieldSubmit
만큼, 같은 장소에 남아있게됩니다.
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) static
필드에 myTextField
및 myTextFieldSubmit
을 확인하고 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("");
}
}
이 방법은 아직 많이있을 수 있으며이를 구현하는 데 더 좋은 방법이있을 수 있습니다. 어떤 접근 방식을 택할지는 응용 프로그램의 원하는 디자인에 따라 달라집니다.
감사! 나는 이것을 (적어도 나를 위해)하는 가장 간결한 방법이라고 생각하기 때문에 (2)를 사용할 것이다. :) –
나는 (2)도 좋아하는 경향이 있으며, 동일한 작업이 수행되는 여러 인스턴스가없는 한 제대로 작동하는 것으로 나타났습니다. 그러나 익명의 클래스는 다른 클래스 나 메서드에서 액세스 할 수 없으므로 단점이있을 수 있음을 지적해야합니다. (경우에 따라 구현 세부 사항을 숨기는 등 긍정적 인 결과를 가져올 수 있습니다.) – coobird