2014-02-28 3 views
0

나는 꽤 멍청하다. 나는 도움이 필요하다.다른 클래스에서 ActionListeners 및 메서드 호출하기

여기에 만들려는 프로그램이 내 의도에 맞춰 사용되었지만 코드를 좀 더 읽기 쉽도록 만들었으므로 ActionListener에 관한 문제가 발생했습니다.

나는 모든 수업을하기 전에 새로운 수업을 만들기 전에 button.addActionListener(this);을 사용했으며 잘 작동했습니다. 이제는 별도의 수업을 듣고 싶었으므로 무엇을해야할지 전혀 모릅니다.

제 질문은 다음과 같은 상황에서 ActionListener을 어떻게 작동시킬 수 있습니까? 아니면 여기서 모든 것을 잘못하고 있습니까? 여기

내가 관련되어 있다고 생각하는 내 코드의 일부 (그것의 대부분을 편집) : 프레임을 가지는 클래스했다
//Class with frame, panels, labels, buttons, etc. 

    class FemTreEnPlus { 
     FemTreEnPlus() { 
      //Components here! 

      //Then to the part where I try to add these listeners 
      cfg.addActionListener(); 
      Exit.addActionListener(); 
      New.addActionListener(); 
     } 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run(){ 
     //Start the Program in the FemTreEnPlus Class 
      new FemTreEnPlus(); 
     }  
    }); 
} 

는, 여기에 다른 클래스의, 방법과

public class FemTreEnMethods extends FemTreEnPlus implements ActionListener { 

     //Perform Actions! 
    public void actionPerformed(ActionEvent ae){ 
     if(ae.getSource() == cfgButton){ 
     configureSettings(); 
     } 
     if(ae.getSource() == newButton){ 
     newProject(); 
     }  
     if(ae.getSource() == exitButton){ 
     exitProgram(); 
     } 
} 

    //All methods are down here 

도움을 받으려면 미리 감사드립니다.

답변

3

자습서의 예제에는 사용자가 수행하는 방식으로 구현 된 리스너의 사용법이 나와 있지만 IMHO는 익명의 내부 클래스를 사용하여 리스너를 구현하는 것이 더 유용합니다. 예를 들어 : 로직이 잘 분리되어

  • 청취자 :

    cfgButton.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerfomed(ActionEvent e) { 
         // do the stuff related to cfgButton here 
        } 
    }; 
    
    newButton.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerfomed(ActionEvent e) { 
         // do the stuff related to newButton here 
        } 
    }; 
    
    exitButton.addActionListener(new ActionListener() { 
        @Override 
        public void actionPerfomed(ActionEvent e) { 
         // do the stuff related to exitButton here 
        } 
    }; 
    

    이러한 접근 방식은 다음과 같은 장점이있다.

  • 누가 이벤트의 출처인지 묻는 if 블록을 중첩하지 않아도됩니다.
  • 새 버튼을 추가하면 리스너를 수정할 필요가 없습니다. 그냥 새 것을 추가하십시오.

물론 경우에 따라 다릅니다. 동작이 구성 요소 집합 (예 : 라디오 단추 또는 확인란)에 대해 동일하면 하나의 수신기 만 있고 해당 이벤트의 소스로 작업 할 때는 EventObject.getSource()을 사용하는 것이 좋습니다. 이 접근법은 here을 제안하고 here을 예로 들었다. 예제는이 방법으로 익명의 내부 클래스를 사용합니다 참고 :

ActionListener actionListener = new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     // do something here 
    } 
}; 
+1

한 익명의 내부 클래스 – mKorbel

+1

이 대답은이 경우에 완벽하게 충분하지만, 나는 또한 행동으로 시도 할 것입니다. 여기에 멋진 소개가 있습니다. http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html 솔루션을보다 유연하게 만들 것입니다. 많은 UI 구성 요소에 대해 하나의 동작을 사용하고 "활성화 된"상태를 한 곳에서) –

+0

감사합니다. 여기저기서 몇 가지 오류를 뒤범벅하고 난 후에 마침내 당신이 설명하는 방식으로, 생성자 내부에서 실제로 작동하게 만들었습니다. (실제로 무엇이 실제로 있는지 전혀 모릅니다.) – user2900511

관련 문제