2009-08-28 3 views
5

기본적으로 다른 클래스에서 실행되고 다른 객체에서 작동하는 메소드를 시작하는 시작 버튼이 있습니다.자바 : 액션 리스너를 사용하여 해당 클래스의 객체에서 다른 클래스의 함수를 호출하십시오.

청취자에 대한 나의 코드 :

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 
} 

내가이 너무 열심히 할 수없는 느낌을 얻을 ,하지만 나는 조각이 빠져있다.

+0

어떤 오류가 있습니까? ActionListener를 버튼에 추가하려고 할 때'sim' 변수가 범위 안에 있습니까? 하나의 전형적인 함정은 ActionListener와 같은 익명의 내부 클래스에서 액세스 할 수 있도록 변수가 최종적으로 필요하다는 것입니다. –

+0

내가 오류를 얻을 : 스레드에서 예외는 "주요"상위를 : 해결되지 않은 컴파일 문제 : \t 심 나는 당신이 그 권리에 생각 를 해결할 수없는 그 시뮬레이션이 범위에 포함되지 않는 문제, 하지만 나는 그것을 최종 결정하는 방법을 알아낼 수 없습니다 .... – Myles

+0

답변을 참조하십시오 맥도웰, 그게 내가 대답 할거야. –

답변

3

한 가지 방법은 final 키워드를 사용한다 이벤트 리스너 (또는 일반적으로 익명의 내부 클래스)에서 변수에 액세스하는 방법에 대한 좋은 예를 통해 이미 실제로 대답합니다. 그러나 a more general Sun resource on Event Listeners in Swing은 정식이며 모든 경고 사항을 잘 기록 할 때 작성해야합니다.

+0

두 번째 옵션에 대해 잘 이해하지 못합니다. 둘러싸는 타입의 메소드에 어떻게 액세스 할 수 있습니까? – Myles

+0

'doFoo()'메소드를'AnctionListenerDemo2'에 추가했다면'actionPerformed' 내부에서 그것을 호출 할 수 있습니다. 'actionPerformed'는 인터페이스 ActionListener의 익명 내부 클래스 구현에 속합니다. 중첩 클래스 소개 : http://java.sun.com/docs/books/tutorial/java/javaOO/nested.html – McDowell

0

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

JFrame을 하위 클래스로 만들거나 JButton이 포함 된 모든 항목을 메인 메서드와 익명 내부 클래스 ActionListener에서 참조 할 수있는 CastleCrash 속성을 모두 갖고 있어야합니다.

하지만 GUI 이벤트 스레드 (동작 수신기가 호출되는 곳)에서 장기 실행 방법을 호출하는 것처럼 보입니다. 이것은 일반적으로 좋지 않은 아이디어입니다. GUI가 응답하지 않게 될 것입니다.

특히이 문제를 피하는 방법에 대한 아이디어는 SwingWorker 클래스의 비트를 참조하십시오.

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); 
    } 
} 
1

맥도웰 : 당신이 바깥 쪽 형식의 멤버 (변수 나 메소드)에 액세스 할 수 있습니다, 또는

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); 
    } 

: 익명 클래스에서 일을 참조 할

2

나는 당신과 같은 문제가 있었는데, 어떻게 해결 했는가.

개체를 최종적으로 만들 수 있습니다 (최종 CastleCrash sim = 새 CastleCrash();).하지만 그렇게하고 싶지 않거나 다른 클래스에서 메서드를 실행하는 setter 메서드 같은 것을 만들 수 있습니다. : 리스너 클래스

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

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 
} 

희망이 도움이된다, 행운을 빌어 요! :)

관련 문제