SWT 프로 그래 밍 기초 - display 와 Shell
우선 코드 를 살 펴 보 겠 습 니 다.
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 프로그램 에서 디 스 플레이 대상 을 다음 과 같이 가 져 올 수 있 습 니 다.
/ / 디 스 플레이 대상 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 의 텍스트 도 변 경 됩 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[CSS] inline, block, inline-blockCSS 에서 display 속성에 대한 inline, block, inline-block 속성값을 알아보겠습니다. inline 속성을 가지고 있는 tag 들은 span, a, img ... 들이 있으며, tag의 종...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.