SWT 프로 그래 밍 기초 - display 와 Shell

11376 단어 displayshellSWT
디 스 플레이 와 셸
우선 코드 를 살 펴 보 겠 습 니 다.
package com.gujin.swt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class HelloSWT {
   public static void main(String[] args)
   {
      Display display = Display.getDefault();
      Shell shell = new Shell(display);
      Label hello = new Label(shell, SWT.NONE);
      hello.setBounds(10, 10, 100, 30);
      hello.setText("Hello SWT");
      shell.open();
      shell.pack();
      while (!shell.isDisposed())
      {
         if (!display.readAndDispatch())
         {
            display.sleep();
         }
      }
      display.dispose();
   }
}

이것 은 매우 간단 한 예제 코드 입 니 다. 우 리 는 그것 을 세 부분 으로 나 눌 수 있 습 니 다. 첫 번 째 부분: 디 스 플레이 대상 만 들 기
Display display = Display.getDefault();
두 번 째 부분: Shell 을 만 들 고 설정 합 니 다.
Shell shell = new Shell(display); Label hello = new Label(shell, SWT.NONE); hello.setBounds(10, 10, 100, 30); hello.setText(“Hello SWT”); shell.open(); shell.pack();
세 번 째 부분: 순환 에 들 어가 기
while (!shell.isDisposed()) {     if (!display.readAndDispatch())    {        display.sleep();     } }
이 세 부분 도 하나의 SWT 프로그램 이 모두 필요 로 하 는 세 부분 이다.
Dispaly 생 성
모든 SWT 프로그램 이 실 행 될 때 디 스 플레이 대상 을 가 져 와 야 합 니 다. 디 스 플레이 가 없 으 면 SWT 프로그램 은 운영 체제 와 대화 할 수 없습니다. SWT 프로그램 에 디 스 플레이 대상 이 하나 이상 포함 되 어 있 습 니 다. 디 스 플레이 대상 을 만 드 는 스 레 드 를 UI 스 레 드 라 고 합 니 다. SWT 프로그램 에서 디 스 플레이 대상 을 다음 과 같이 가 져 올 수 있 습 니 다.
  • new Display: 새 디 스 플레이 인 스 턴 스 만 들 기
  • Display. getDefault (): 첫 번 째 호출 은 디 스 플레이 대상 을 만 든 다음 에 다시 호출 하면 이전에 만 든 디 스 플레이 대상 을 얻 을 수 있 습 니 다. 호출 전에 new Display 를 통 해 디 스 플레이 대상 을 얻 었 다 면 Display. getDefault () 를 호출 하면 이전에 새로 만 든 디 스 플레이 대상
  • 을 얻 을 수 있 습 니 다.
    / / 디 스 플레이 대상 Display create 를 만 듭 니 다 = Display. getDefault (); / 디 스 플레이 대상 Display display = Display. getDefault (); / / 두 번 의 획득 대상 은 같은 System. out. println (create = = display) 입 니 다.
    이 코드 의 출력 결 과 는 true 입 니 다. 같은 아래 코드 도 같은 효과 입 니 다.
    / / 디 스 플레이 대상 디 스 플레이 create = new Display () 를 만 듭 니 다. / / 디 스 플레이 대상 디 스 플레이 display = Display. getDefault () 를 얻 습 니 다. / / 두 번 얻 은 대상 은 같은 System. out. println (create = = display) 입 니 다.
    한 스 레 드 에 두 개의 활성 디 스 플레이 가 동시에 존재 하지 않 습 니 다. 이렇게 하면 프로그램 이 실 행 될 때 SWT 이상 을 던 집 니 다. 동시에 활성 화 된 디 스 플레이 인 스 턴 스 를 여러 개 만 들 려 면 서로 다른 스 레 드 에서 만들어 야 합 니 다. 디 스 플레이. getCurrent () 함 수 를 통 해 현재 스 레 드 에 대응 하 는 디 스 플레이 인 스 턴 스 를 가 져 올 수 있 습 니 다. Display. findDisplay 를 사용 하 십시오.(Thread) 는 임의의 스 레 드 에 있 는 디 스 플레이 대상 을 찾 을 수 있 습 니 다. 다 중 스 레 드 에 서 는 디 스 플레이. getDefault () 를 사용 하여 디 스 플레이 인 스 턴 스 를 얻 지 말 아야 합 니 다. "불법 스 레 드 접근" 의 이상 이 발생 하기 쉬 우 므 로 다음 과 같은 방법 으로 디 스 플레이 사례 를 얻 을 수 있 습 니 다.
    public static Display getThreadDisplay()
    {
       return Display.getCurrent() == null ? new Display() : Display.getCurrent();
    }

    Shell 생 성
    SWT 프로그램 에서 하나의 Shell 은 하나의 창 을 의미 합 니 다. SWT 프로그램 에 서 는 자원 관 리 를 더욱 편리 하 게 하기 위해 부모 자원 이 방출 될 때 자신 만 의 하위 자원 을 방출 하 는 것 을 책임 집 니 다. Display 에서 직접 생 성 된 Shell 은 Display 의 하위 자원 이 고 특정한 Shell (Shell A) 에서 생 성 됩 니 다.만 든 Shell B 는 Shell A 의 하위 자원 입 니 다. 부모 자원 인 Shell 이 방출 되면 하위 자원 인 Shell 도 동시에 방출 되 고 모든 Shell 은 Display 에서 직접 또는 간접 적 으로 생 성 되 기 때문에 Display 는 모든 Shell 의 최고 층 부모 자원 입 니 다. 디 스 플레이 가 방출 되면 이 UI 스 레 드 에 존재 하 는 Shell 창 이 모두 방출 됩 니 다.빠지다
    디 스 플레이 의 이벤트 큐 와 이벤트 순환
    창 을 만 들 고 열 면 이벤트 순환 에 들 어 갑 니 다.
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
        {
           display.sleep();
        }
    }

    이 코드 는 이벤트 의 순환 을 처리 하 는 데 사 용 됩 니 다. 이 코드 를 통 해 SWT 는 순환 을 통 해 이벤트 대기 열 에서 정 보 를 얻 고 처리 하 는 것 을 발견 할 수 있 습 니 다. 따라서 오래 걸 리 는 사건 을 처리 할 때 프로그램 이 막 히 기 쉽 고 사용자 의 신체 검사 도가 낮 습 니 다. 코드 를 통 해 보 여 드 리 겠 습 니 다.
    package com.gujin.swt;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    
    public class HelloSWT {
       public static void main(String[] args)
       {
          Display display = Display.getDefault();
          Shell shell = new Shell(display);
          final Label label = new Label(shell, SWT.NONE);
          label.setBounds(10, 10, 200, 30);
          label.setText("before");
          Button button = new Button(shell, SWT.BORDER);
          button.setBounds(10, 50, 200, 30);
          button.setText("deal");
          button.addSelectionListener(new SelectionAdapter() {
             @Override
             public void widgetSelected(SelectionEvent e)
             {
                try
                {
                   Thread.sleep(10000);
                }
                catch (Exception e2)
                {
                }
                label.setText("after");
             }
          });
          shell.open();
          shell.pack();
          while (!shell.isDisposed())
          {
             if (!display.readAndDispatch())
             {
                display.sleep();
             }
          }
          display.dispose();
       }
    }

    이 코드 를 실행 하면 단 추 를 누 르 면 이벤트 처리 가 끝 날 때 까지 창 이 막 히 는 것 을 알 수 있 습 니 다. 이것 은 실제 응용 에서 바람 직 하지 않 을 것 입 니 다. 디 스 플레이 에서 syncExec (Runnable r) 와 asyncExec (Runnable r) 를 제공 하여 대기 열 에 이 벤트 를 삽입 할 수 있 습 니 다. 우 리 는 위의 코드 를 다음 과 같이 수정 할 수 있 습 니 다.
    package com.gujin.swt;
    
    import org.eclipse.swt.SWT;
    import org.eclipse.swt.events.SelectionAdapter;
    import org.eclipse.swt.events.SelectionEvent;
    import org.eclipse.swt.widgets.Button;
    import org.eclipse.swt.widgets.Display;
    import org.eclipse.swt.widgets.Label;
    import org.eclipse.swt.widgets.Shell;
    
    public class HelloSWT {
       public static void main(String[] args)
       {
          final Display display = Display.getDefault();
          Shell shell = new Shell(display);
          final Label label = new Label(shell, SWT.NONE);
          label.setBounds(10, 10, 200, 30);
          label.setText("before");
          Button button = new Button(shell, SWT.BORDER);
          button.setBounds(10, 50, 200, 30);
          button.setText("deal");
          button.addSelectionListener(new SelectionAdapter() {
             @Override
             public void widgetSelected(SelectionEvent e)
             {
                new Thread() {
                   @Override
                   public void run()
                   {
                      try
                      {
                         Thread.sleep(10000);
                      }
                      catch (Exception e2)
                      {
                      }
                      display.syncExec(new Runnable() {
    
                         @Override
                         public void run()
                         {
                            label.setText("after");
                         }
                      });
                   }
                }.start();
             }
          });
          shell.open();
          shell.pack();
          while (!shell.isDisposed())
          {
             if (!display.readAndDispatch())
             {
                display.sleep();
             }
          }
          display.dispose();
       }
    }

    저 희 는 시간 이 많이 걸 리 는 논 리 를 처리 하기 위해 새로운 스 레 드 를 시작 합 니 다. 처리 가 끝 난 후에 시간 대기 열 에 이 벤트 를 추가 하여 후속 작업 을 완성 하려 고 합 니 다. 이때 단 추 를 누 르 면 창 에 이전의 차단 현상 이 나타 나 지 않 고 이벤트 처리 가 끝 난 후에 Label 의 텍스트 도 변 경 됩 니 다.

    좋은 웹페이지 즐겨찾기