2013-10-25 1 views
0

자바 스윙 GUI에 대한 정리 및 OOP 코드를 만들려고합니다. 그래서 Runnable을 구현하는 클래스를 만들고 모든 액션을 처리해야합니다. 데이터 클래스에 저장된 모든 데이터와 구성 요소는 getter 및 setter로 가득합니다. Java - (내부가 아닌) 실행 클래스의 작업 목록이 수행하지 않습니다.

public class UserInterface{ 
... 
    public void foo(){ 
     PanelActions panelActions = new PanelActions(); 
     Thread tProgressbar = new Thread(panelActions, "Update progressbar"); 
     tProgressbar.start(); 
    } 
} 

public class PanelActions implements Runnable{ 
    GUIdata data = new GUIdata(); 
    public void run(){ 

     //submitButton 
     data.getSubmitButton().addActionListener(new ActionListener(){ 
      @Override 
      public void actionPerformed(ActionEvent evt) { 
        //Some code 
      }   
     }); 

     //Browse Button 
     data.getBrowseButton().addActionListener(new ActionListener(){  
      @Override 
      public void actionPerformed(ActionEvent evt) { 
        //Some code 
      }   
     }); 
    }; 
} 

와 getter 및 setter 클래스 :

public class GUIdata{ 
    private JButton submitButton; 
    private JButton browseButton; 

    GUIdata(){ 
     submitButton = new JButton(); 
     browseButton = new JButton(); 
    } 

    public JButton getSubmitButton() { 
     return submitButton; 
    } 

    public void setSubmitButton(JButton submitButton) { 
     this.submitButton = submitButton; 
    } 

    public JButton getBrowseButton() { 
     return browseButton; 
    } 

    public void setBrowseButton(JButton browseButton) { 
     this.browseButton = browseButton; 
    } 
} 

그러나의 actionPerformed의 코드가 작동하지 않습니다 이런 식으로. 스레드가 시작되고 run 메소드가 잘 작동합니다. 하지만 아마도 get 메소드에 ActionListener을 추가하는 것을 원하지 않을 것입니다. 심지어 내가 이것을 시도 :

JButton browse = data.getBrowseButton(); 

browse.addActionListener(new ActionListener(){ 
    @Override 
    public void actionPerformed(ActionEvent evt){ 
     //Some code     
    } 
}); 
data.setBrowseButton(browse);seButton(browse); 

하지만 그게 옳지 않아.

다른 사람이 ActionListener를 다른 클래스의 Button에 추가하는 방법을 알고 있습니까? 고마워요 :)

+0

이 버튼은 UI에 등록되지 않은 것 같습니다. –

+0

나는 공연하지 않을 이유가 없다. 하지만 제 질문은 : 당신은 심지어 행동을 시도 했습니까? 그것을 주먹으로 치려고 했습니까? – Sage

+0

@SotiriosDelimanolis UserInterface 클래스에 추가하지만,이 문제를 해결하는 것은 아닙니다. – Lutske

답변

2

별도의 스레드에서 작업을 실행하려면 메서드 실행에 작업 수신기를 만들지 말고 메서드 실행에 수행 할 작업을 넣으십시오. 모든 실행 가능한 PanelActions에서

  1. 제거 :의 actionPerformed에서

    public class PanelActions { 
    GUIdata data = new GUIdata(); 
    
    
    //submitButton 
    data.getSubmitButton().addActionListener(new ActionListener(){ 
        @Override 
        public void actionPerformed(ActionEvent evt) { 
          //Some code 
        }   
    }); 
    
    //Browse Button 
    data.getBrowseButton().addActionListener(new ActionListener(){  
        @Override 
        public void actionPerformed(ActionEvent evt) { 
          //Some code 
        }   
    }); 
    } 
    
  2. 가의 Runnable을 만들거나 댓글과 그것을 실행

    @Override 
    public void actionPerformed(ActionEvent evt) { 
        Thread thread = new Thread() { 
         @Override 
         public void run() { 
          //Some code 
         } 
        }; 
        thread.start(); 
    } 
    
0

"Update progressbar" 시작은 나에게 당신이해야 할 수도 있습니다 인상을 준다 invokeLater :

data.getBrowseButton().addActionListener(new ActionListener(){  
     @Override 
     public void actionPerformed(ActionEvent evt) { 
      EventQueue.invokeLater(new Runnable() { 
       //Some code 
      }); 
     }   
    }); 

이렇게하면 이벤트 처리 스레드가 버튼 클릭 (actionPerformed)을 처리 할 수 ​​있습니다. 그리고 잠시 후 코드가 실행되고 반응적으로 진행 막대를 다시 칠합니다.

다른 소프트웨어 디자인이 더 깨끗할 수 있습니다. 액션 (AbstractAction 확장)을 사용할 수 있습니다. 몇 가지 조치를 취하여 JButton에 넣으십시오.

+0

팁 주셔서 감사합니다! – Lutske

+0

모든 이벤트가 EDT에서 실행됩니다. 나는 당신의 요지를 얻지 못했습니다. 내부의'actionPerformed' 함수'Thread.currentThread()'는 다음과 같이 쉽게 응답 할 것입니다 :'Thread [AWT-EventQueue-0,6, main]'stuff – Sage

관련 문제