크로스 스 레 드 조작 UI

9047 단어 직장레저UIJava
모두 가 알 고 있 는 이유 로,일반적으로 하나의 스 레 드 만 UI 를 조작 합 니 다.다 중 스 레 드 프로그램 에 대해 어떻게 작업 스 레 드 로 UI 를 조작 하 게 합 니까?C++에 서 는 윈도 메시지,sendmessage,postmessage 를 편리 하 게 이용 할 수 있 습 니 다.C\#에 서 는 MSDN 에서 도 의뢰 하 는 방법 을 제시 했다.그럼 자바 중 에는 요?
    자바 에 서 는 관찰자 패턴 이 흔 하 다.크로스 스 레 드 조작 UI 도 관찰자 모드 로 구현 할 수 있다.UI 스 레 드 는 관찰자 로 서 작업 스 레 드 에'움직임'이 있 을 때 UI 스 레 드 를 주동 적 으로 알려 줍 니 다.
   
   
   
   
  1. import java.util.Observable; 
  2. import java.util.Observer; 
  3.  
  4. public class MyAction extends Observable{ 
  5.  
  6.     public void test(){ 
  7.         this.setChanged(); 
  8.         this.notifyObservers(); 
  9.          
  10.     } 
  11.  

    관찰 대상'마 이 액 션'은 테스트 방법 을 통 해 관찰자 에 게 알 린 다.MyAction 은 작업 스 레 드 에 있 을 겁 니 다.
   
   
   
   
  1. public class MainFrame extends JFrame implements Observer { 
  2.  
  3.     @Override 
  4.     protected void frameInit() { 
  5.         // TODO Auto-generated method stub 
  6.         super.frameInit(); 
  7.         this.setLayout(null); 
  8.         JButton jb = new JButton("test"); 
  9.         jb.setSize(100100); 
  10.         jb.addActionListener(new ActionListener() { 
  11.              
  12.             @Override 
  13.             public void actionPerformed(ActionEvent e) { 
  14.                 // TODO Auto-generated method stub 
  15.                 Thread t = new Thread(){ 
  16.  
  17.                     @Override 
  18.                     public void run() { 
  19.                         // TODO Auto-generated method stub 
  20.                         MyAction action = new MyAction(); 
  21. //
  22.                         action.addObserver(MainFrame.this); 
  23.                         try { 
  24.                             this.sleep(5000); 
  25.                         } catch (InterruptedException e) { 
  26.                             // TODO Auto-generated catch block 
  27.                             e.printStackTrace(); 
  28.                         } 
  29.                         action.test(); 
  30.                     } 
  31.                      
  32.                 }; 
  33.                 t.start(); 
  34.             } 
  35.         }); 
  36.         this.add(jb); 
  37.     } 
  38.  
  39.     /** 
  40.      * @param args 
  41.      */ 
  42.     public static void main(String[] args) { 
  43.         // TODO Auto-generated method stub 
  44.         MainFrame f = new MainFrame(); 
  45.         f.setVisible(true); 
  46.         f.setDefaultCloseOperation(EXIT_ON_CLOSE); 
  47.         f.setSize(200200); 
  48.          
  49.     } 
  50.      
  51.     @Override 
  52.     public void update(Observable o, Object arg) { 
  53.         // TODO Auto-generated method stub 
  54.         JOptionPane.showMessageDialog(null"message"); 
  55.          
  56.     } 
  57.  

관찰자 가 알림 을 받 으 면 update 방법 이 호출 되 며,이 방법 에서 UI 를 업데이트 하면 됩 니 다.
 
오류 정정:      이런 방법 은 크로스 라인 조작 UI 를 실현 할 수 없다.테스트 방법,update 방법 에서 Thread.currentThread().getId()를 가 져 와 UI 스 레 드 가 아 닌 ID 를 발견 합 니 다.Observable 코드 를 보 았 는데 스 레 드 를 뛰 어 넘 는 내용 이 없 었 습 니 다.      그러나 다음 JComponent 방법 은 안전 합 니 다.모든 스 레 드 에서 repaint(),revaidate(),invalidate()를 호출 할 수 있 습 니 다.(repaint()와 revaidate()방법 은 이벤트 배포 스 레 드 를 위해 대기 열 을 요청 하고 각각 paint()와 vaidate()방법 을 호출 합 니 다.invalidate()방법 은 확인 이 필요 할 때 하나의 구성 요소 와 모든 직접 조상 을 표시 합 니 다.)그래서 이 방법 들 을 다시 써 서 UI 를 업데이트 할 수 있 습 니 다.      또한 타이머 로 작업 스 레 드 의 데 이 터 를 주동 적 으로 가 져 올 수 없습니다.타이머 가 다른 스 레 드 에서 실행 되 기 때문에 참고 할 수 있 습 니 다.http://jianshusoft.blog.51cto.com/2380869/764382。

좋은 웹페이지 즐겨찾기