GUI 구성 요소가 생성되기 전에 액세스하려고하기 때문에 java.lang.NullPointerException
이 발생한다고 생각합니다. 이상적으로는
내가이
package test;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
public class GUIThread implements Runnable
{
private Display display;
private Label label;
public Display getDisplay(){
return display;
}
public void run()
{
display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout());
shell.setLayoutData(new GridData(SWT.FILL,SWT.FILL,true,false));
label = new Label(shell,SWT.NONE);
label.setText(" -- ");
shell.open();
shell.pack();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
public synchronized void update(final int value)
{
if (display == null || display.isDisposed())
return;
display.asyncExec(new Runnable() {
public void run() {
label.setText(""+value);
}
});
}
}
처럼 그리고 내 주요 방법 ... 별도의 스레드에서 하나의 GUI를 만들 ... 예를 들어 ... 창조 얻을 수있는 GUI 구성 요소에 대한 기다려야 전 우리는 위의 코드에 POINT OF FOCUS
을 주석 경우 지금 ....
package test;
import org.eclipse.swt.widgets.Display;
public class Main
{
public static void main(String[] args) throws Exception
{
final GUIThread gui = new GUIThread();
Thread t = new Thread(gui);
t.start();
Thread.sleep(3000); // POINT OF FOCUS
Display d = gui.getDisplay();
for(int i = 0; i<100; i++)
{
System.out.println(i + " " + d);
gui.update(i);
Thread.sleep(500);
}
}
}
을 같은 것을 할 나는 항상 NullPointerException
을 얻을 것이다 ...하지만 삼초의 지연은 내 GUI 스레드에게 될 수있는 충분한 시간을 제공합니다 준비 상태이므로를 통과하지 못합니다......
이와 같은 시나리오에서는 wait
및 yield
메서드를 효율적으로 사용해야합니다. 그렇지 않으면 "버그 찾기 어려움"이 발생합니다. 즉, UI가 제대로 인스턴스화 될 때까지 기다린 다음 yield ...
또한 실제 처리는 메인 스레드에서 이루어지며 GUI는 별도의 스레드에서 실행 중입니다 ... 적절하게 통신하려면 일부 공유 및 동기화 된 데이터 구조가 있어야합니다. 또는 다음을 사용하여 수행 할 수 있습니다. 소켓 통신 ... 일부 port
및 GUI 스레드 asynchronously
해당 포트에서 수신 대기 메인 스레드 ....
희망이 throug 것입니다 당신의 문제에 대한 약간의 조명 ....
일반적으로 잘못된 스레드에서 일부 GUI 구성 요소를 업데이트 할 때'NullPointerException'을 얻지 못합니다. 정말 스레딩 문제일까요? – Flavio