리스너를 사용하여 다른 요소에 액세스하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/816188

  •  03-07-2019
  •  | 
  •  

문제

양식 요소에서 입력 한 정보를 가져와 정보를 조작 해야하는 GUI를 설정하고 있습니다. 이를 위해서는 다른 요소를 사용하여 다른 요소에 접근해야합니다.

예를 들어 입력 상자가 있습니다 (JTextField) 및 버튼 (JButton) 옆에. 버튼을 누르면 입력 상자에 입력 된 텍스트를 조작 할 수 있어야합니다. 내가이 일을 끝내기 위해 지금까지 시도한 모든 것이 실패했습니다.

이것이 바로 내 코드의 모습입니다 (의견에 내 질문을 포함 시켰습니다).

public class MyClass
{
    public static void main(String args[])
    {
        // Form elements are in here
        JTextField myTextField = new JTextField(10);
        JButton myTextFieldSubmit = new JButton("Submit");
        myTextFieldSubmit.addActionListener(new ListenerClass());
    }
}

class ListenerClass implements ActionListener
{
    public void actionPerformed(ActionEvent e)
    {
        // This is what happens when these elements are used
        // I need to be able to access the form elements from MyClass in here, but this doesn't seem possible with my current setup
        // For example, when the Submit button is pressed, I need to be able to myTextField.getText() and edit MyClass members
        // How should my setup be changed to accommodate these needs?
    }
}

도움을 주셔서 감사합니다!

도움이 되었습니까?

해결책

이것은 매우 다양한 범위 문제입니다.

현재 텍스트 필드와 버튼은 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("");
  }
}

이를 달성하는 방법이 더 많을 것입니다.이를 구현하는 더 좋은 방법이있을 수 있습니다. 당신이 취하는 접근법의 선택은 실제로 원하는 응용 프로그램 설계에 달려 있습니다.

다른 팁

당신은 참조로 전달할 수 있습니다 MyClass 생성자에서 ListenerClass.

귀하의 문제는 Java에서 모든 목적으로 청취자를 사용하는 데 일반적입니다. 핸들러가 청취자 또는 동료에게 알리는 객체에 액세스하도록하는 방법.

일반적으로 두 가지 규칙이 있습니다.

하나는 객체를 이벤트 객체에서 직접 가져 오는 것입니다. getSource () 로이 작업을 수행 할 수 있습니다. 그러나 당신은 그 위젯 만 얻을 것입니다.

또 다른 옵션은 리스너 클래스가 위젯에 액세스 할 수 있도록하는 것입니다. 한 가지 방법은 비 정적 내부 클래스를 사용하는 것입니다 (선언 방법에 따라 다름).이 경우 포함 클래스의 구성원에게 액세스 할 수 있습니다.

그러나이 경우 위젯은 멤버가 아닌 변수입니다 (그렇게하고 싶습니까?). 따라서 유일한 솔루션은 Listner 클래스에 회원을 잡고 AddListener 호출에서 리스너를 작성하는 대신 청취자를 만들고 관련 위젯을 전달하고 리스너를 추가하는 것입니다. 청취자는 이제 멤버에 저장된 자신의 언급을 통해 해당 위젯에 액세스 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top