2012-12-11 5 views
1

자바에 대한 새로운 내용과 여러 버튼과 드롭 다운 메뉴로 간단한 GUI를 작성하려고하는 메신저. Ive는 작동하는 GUI를 얻을 수 있었지만 실제 질문은 actionListener 메소드의 올바른 사용에 관한 것입니다. 그 코드가 단정하고 올바른 것으로 간주됩니다자바에서 actionListener의 올바른 사용

public class GUI implements something 
{ 
    public static ClientGUI App; 
    private JFrame chatWin; 
    private JMenuBar menubar; 
    private JMenu x; 
    private JMenu y; 
    private JMenuItem exit; 
    private JMenuItem about; 


    public GUI() 
    { 

       /* 
       * some code and parameters 
       */ 

      //creating the menu bar 
      JMenuBar menubar = new JMenuBar(); 
      chatWin.setJMenuBar(menubar); 

      JMenu x= new JMenu("menu1"); 
      menubar.add(x); 
      JMenuItem exit = new JMenuItem("menu2"); 
      x.add(exit); 

      JMenu y= new JMenu("Help"); 
      menubar.add(help); 
      JMenuItem about = new JMenuItem("inner menu1"); 
      y.add(about); 

      //action listener for the exit button 
      class exitaction implements ActionListener 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        System.exit(0); 
       } 
      } 
      exit.addActionListener(new exitaction()); 

      //action listener for the about button 
      class aboutaction implements ActionListener 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        //some code 
       } 

      } 
     } 

    public static void main (String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       App = new GUI(); 
      } 
     }); 
    } 


} 

은 다음과 같습니다 나는 자신의 클래스의 각 ActionListener를 삽입 버튼에 액션을 할당하기 위해이 코드는? 향상 시키거나 변경할 필요가있는 것이 있습니까?

+1

http://codereview.stackexchange.com/ –

답변

2

나는 규칙을 따릅니다.

public MyFrame extends JFrame { 

     // componentes creating, etc 

     private static class MyShortAction implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e){ 
       // some big implementation 
      } 

     } 

    } 

간단히 말해서, 나는 익명의 클래스에 넣었습니다.

myButton.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     // some small code 
    } 

}); 

다른 구성 요소에서 사용하는 경우 최상위 클래스로 추출합니다.

public class MyAction implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     // some small code 
    } 
} 
+0

정말로 도움이 된 모든 분들께 감사드립니다! 큰 감사 Marcio, 나는 당신의 조언을 사용하고 그것은 아름답게 작동합니다! – undroid

+0

예, 귀하의 규칙도 마음에 들었습니다. Obrigado : - P –

0

public class GUI implements something,ActionListener 
{ 
    //... 
    public GUI() 
    { 
     //... 
     exit.setActionListener(this); 
     about.setActionListener(this); 
     //... 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     Object source = e.getSource(); 
     if(source == exit) 
     { 
      System.exit(0); 
     } else if(source == about) 
     { 
      //action 
     } 
    } 
} 

는 또한 작업 명령을 설정할 수 있습니다 ... 그것은 작동하지만 당신은 분리 된 클래스 또는 대신 모든 버튼에 대한 중첩 클래스를 작성의 기본 클래스에서 그것을 구현할 수 있습니다 항목을 비교하고 객체 대신 문자열을 비교합니다. 버튼에 액션 청취자를 추가

public class GUI implements something,ActionListener 
{ 
    //... 
    public GUI() 
    { 
     //... 
     exit.setActionCommand("exit"); 
     exit.addActionListener(this); 

     about.setActionCommand("about"); 
     about.addActionListener(this); 
     //... 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     String action = e.getActionCommand(); 
     if("exit".equals(action)) 
     { 
      System.exit(0); 
     } else if("about".equals(action)) 
     { 
      //action 
     } 
    } 
} 
+1

나는 메인 클래스의 청취자를 개선하여 구현하는 것을 거의 부르지 않을 것이다. 이것은 내부 API를 공개 API에 노출시키고, 미묘한 문제를 발생시킵니다. 예를 들어, 버튼을 직렬화하면 GUI의 필드와 수퍼 클래스도 직렬화됩니다. – ignis

0

간단한 직접적인 방법 :

액션 구현이 큰

경우, 나는 내부 클래스에 넣어 :

//Create the button 
JButton button_save = new JButton("Save"); 
add(button_save); 

// Create the listener 
button_save.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
    //do your stuff when button clicked 
    //ex: disable the button 
    button_save.setEnabled(false); 
    } 
}); 
0

IMHO 코드가 이미 맞습니다 (실제로 작동하고있는 것 아닌가요?). 나머지는 대부분 취향 (코드 사용의 문제)입니다. 예를 들어 나중에 코드를 재사용하거나 프로그램에 기능 및 기타 버튼을 추가 할 수 있습니다. 따라서 엄지 손가락의 다음과 같은 규칙을 시도해보십시오

  • 는 내부 클래스
    을 피하기 - 당신이 다른 곳에서 그 클래스의 객체를 인스턴스화 할 때 당신이 알고하지 않습니다. 따라서, 각 클래스에 대해 하나 개의 파일을 사용 (그리고 BTW 클래스는 대문자로 시작한다)
  • 는 자신의 클래스에 의 ActionListener 의 각 구현을 넣어. 나는 이것이 당신의 프로젝트를 날려 버릴 것이라는 것을 알고 있지만 모든 코드는 명확하게 정리 될 것이고 기능을 재사용 할 수도 있습니다. 예를 들어 이탈 버튼. 어쩌면 프로그램의 다른 곳에서 두 번째 exit 버튼을 사용하기로 결정한 다음 두 버튼에 동일한 ActionListener와 동일한 기능을 부여 할 수 있습니다.

컴파일러의 경우에는 차이가 없지만 프로젝트가 커지면서 점점 더 복잡해지기 시작하면 좋습니다.

+0

정교한 답변 주셔서 감사합니다! – undroid