Java : ActionListener를 사용하여 해당 클래스의 객체에서 다른 클래스에서 함수를 호출합니다.

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

문제

기본적으로 내가하고 싶은 것은 다른 클래스에서 실행되고 다른 객체에서 행동하는 메소드를 시작하는 시작 버튼을 가져 오는 것입니다.

청취자를위한 내 코드 :

button1a.addActionListener(new ActionListener() {
    public void actionPerformed (ActionEvent event) {
        // Figure out how to make this work
        //sim.runCastleCrash(); 
    }
} );

다른 클래스에 대한 내 코드 :

public static void main(String[] args) {
    CastleCrash sim;
    sim = new CastleCrash();
}

그리고

public void runCastleCrash() {
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

나는 이것이 너무 힘들 수 없다는 느낌을 얻지 만 조각이 빠져 있습니다.

도움이 되었습니까?

해결책

익명 수업에서 물건을 참조하는 한 가지 방법은 final 예어:

  public static void main(String[] args) {
    final Object thingIWantToUse = "Hello";

    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        System.out.println(thingIWantToUse);
      }
    });

    JFrame frame = new JFrame();
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

또는 동봉 유형의 멤버 (변수 또는 방법)에 액세스 할 수 있습니다.

public class ActionListenerDemo2 {
  private final JFrame frame = new JFrame();
  private Object thingIWantToUse = "Hello";

  public ActionListenerDemo2() {
    JButton button = new JButton("Click");
    button.addActionListener(new ActionListener() {
      @Override public void actionPerformed(ActionEvent e) {
        thingIWantToUse = "Goodbye";
        System.out.println(thingIWantToUse);
      }
    });
    frame.setLayout(new FlowLayout());
    frame.add(button);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }

  public static void main(String[] args) {
    new ActionListenerDemo2().frame.setVisible(true);
  }
}

다른 팁

나는 당신과 같은 문제를 겪었고 이것이 내가 그것을 해결 한 방법입니다.

객체를 최종적으로 만들 수 있습니다 (Final CastleCrash SIM = New CastleCrash ();), 나는 그렇게하고 싶지 않았거나 다른 클래스에서 메소드를 실행하기 위해 세터 메소드와 같은 것을 만들 수 있습니다.

청취자 클래스에 대한 내 코드 :

button1a.addActionListener(new ActionListener()
{

    public void actionPerformed (ActionEvent event)
    {
    //How to make this work ?
    //Like this:
    runCC();
    }
});

public void runCC()
{
    CastleCrash sim = new CastleCrash();
    sim.runCastleCrash();
}

다른 클래스에 대한 내 코드 :

public void runCastleCrash()
{   
    System.out.println("Castle Crash is beginning...");
    //Other method parts here to be added
}

이것이 도움이되기를 바랍니다. 행운을 빕니다! :)

McDowell은 이미 이벤트 청취자 (또는 일반적으로 익명의 내부 클래스)의 변수에 액세스하는 방법에 대한 좋은 예제로 실제로 답변합니다. 그러나 있습니다 스윙의 이벤트 청취자에 대한보다 일반적인 태양 자원 그것은 글을 쓸 때 고려해야 할 모든 경고에 대한 정식적이고 좋은 개요입니다.

어쨌든 ActionListener에서 호출 할 수있는 CastleCrash 객체에 대한 참조가 필요합니다.

당신은 아마도 JFrame을 서브 클래스 또는 JBUTTON을 포함하는 모든 것이 당신의 주요 방법과 CastleCrash 속성을 모두 가지고 있도록 익명의 내부 클래스 액션 리스트너에서 참조 할 수 있습니다.

그러나 조심하십시오. GUI 이벤트 스레드 (ACTION 리스너가 호출되는 곳) 내에서 장기적인 방법이 될 것을 부르는 것처럼 보입니다. 이것은 일반적으로 나쁜 생각입니다. GUI가 응답하지 않도록합니다.

보다 http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html 특히 그 문제를 피하는 방법에 대한 아이디어에 대한 스윙 워크 클래스의 비트.

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