2009-03-23 3 views
1

내 actionListener에 문제가 있습니다. 버튼을 클릭하기 전에 actionListener가 자동으로 실행되는 것 같습니다. I 버튼 "...이 이상하다을 클릭하기 전에 은"이 버튼을 클릭하기 전에 콘솔에 표시되지해야한다 "콘솔에 나타납니다.ActionListener 문제

.... 
button1.addActionListener(this); 
button2.addActionListener(this); 
.... 
public void actionPerformed(ActionEvent e) { 

    System.out.println("This should not appear in the console before button click"); 

    if (e.getSource()==button1) 
     System.out.println ("answer1"); 

    else if (e.getSource()==button2) 
     System.out.println ("answer2"); 
    ..... 
} 
+0

addActionListener()의 컨텍스트를 게시 할 수 있습니까? –

+0

버튼을 클릭하면 public void actionPerformed (ActionEvent e) {} 메소드가 호출됩니다. 하지만 제 경우에는 단추를 클릭하기 전에 자동으로 메서드를 실행하는 것처럼 보입니다. – Jessy

답변

5

당신은 방법을 호출하여 호출되는 위치를 알 수 있습니다 .. Thread.dumpStack() 오류 스트림 (아마도 자바 콘솔)에 스택 추적을 인쇄 할 수 또는 디버거를 사용하는 방법의 첫 번째 줄에 중단 점을 배치

public void actionPerformed(ActionEvent e) { 
    Thread.duumpStack(); 
    System.out.println("This should not appear in the console before button click"); 
    ... 

을 BTW :. 나는 EventObject.getSource를 사용하지 않는 것이 좋습니다 대신 모든 작업에 대해 새 수신기를 추가하십시오.

button1.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     System.out.println("answer1"); 
    } 
}); 
button2.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent event) { 
     System.out.println("answer2"); 
    } 
}); 

불행하게도 익명의 내부 클래스와 관련된 보일러가 분명히 자세한하지만 의도는 분명하다 :

그래서 귀하의 예제 코드가 될 것입니다.

+0

나는 자바에 매우 익숙하지 않다 ... 나는 당신이 의미하는 바를 이해하지 못한다. 대신에 모든 행동에 대해 새로운 청취자를 추가한다 ... – Jessy

+0

@Tom : 오직 하나의 내부 클래스를 갖는 더 깨끗한 사람을 알고있다. 여러 개의 익명 클래스 대신. 그것은 주로 나에게 스타일 문제처럼 보입니다. –

+0

@ mmyers : 그들은 틀 렸습니다. –

0

버튼 중 하나를 클릭하기 전에 사용할 수있는 다른 구성 요소에 'this'를 추가하지 않았는지 확인하십시오. doClick() 호출에 대한 코드를 검색하여 프로그래밍 방식으로 호출하지 않도록 할 수도 있습니다.