小弟才用swt, 做个小程序来感觉下。
结果发现这个问题 从登录界面 成功登录后 调用主界面出问题了 就是调用不出来
Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
at main.com.ztesh.www.MainFrame.createMainFrame(MainFrame.java:49)
at main.com.ztesh.www.MainFrame.run(MainFrame.java:155)
at java.lang.Thread.run(Thread.java:595)这里我先吧我的代码贴上来 LoginGUI.javapackage main.com.ztesh.www;
class LoginGUI
{

Shell she;

Display dis ; public LoginGUI(Display dis)
{
this.dis = dis;
} public void loginFrame()
{
she = new Shell(dis);
she.setBounds(350, 180, 323, 200);
she.setText("Login");
she.setImage(new Image(dis, "titleImage.ico"));
// 设置布局管理器
FormLayout form = new FormLayout();
she.setLayout(form); // 用户名
final Label l1 = new Label(she, SWT.RIGHT);
l1.setText("User Name:");
FormData fd = new FormData();
fd.top = new FormAttachment(10, 10);
fd.left = new FormAttachment(0, 10);
fd.bottom = new FormAttachment(30, 0);
fd.right = new FormAttachment(40, 0);
l1.setLayoutData(fd); // 密码
final Label l2 = new Label(she, SWT.RIGHT);
l2.setText("Password:");
fd = new FormData();
fd.top = new FormAttachment(l1, 5);
fd.left = new FormAttachment(0, 10);
fd.bottom = new FormAttachment(40, 0);
fd.right = new FormAttachment(40, 0);
l2.setLayoutData(fd); // 用户名对应的输入框
final Text t1 = new Text(she, SWT.BORDER | SWT.SINGLE);
fd = new FormData();
t1.setTextLimit(10);
fd.top = new FormAttachment(l1, 0, SWT.TOP);
fd.left = new FormAttachment(l1, 10);
t1.setLayoutData(fd); // 密码对应的输入框
final Text t2 = new Text(she, SWT.BORDER | SWT.SINGLE);
fd = new FormData();
t2.setEchoChar('*');
t2.setTextLimit(10);
fd.top = new FormAttachment(l2, 0, SWT.TOP);
fd.left = new FormAttachment(l2, 10);
t2.setLayoutData(fd); // 确定按钮
final Button cmdSend = new Button(she, SWT.PUSH);
cmdSend.setText("  O K  ");
fd = new FormData();
fd.top = new FormAttachment(55);
fd.left = new FormAttachment(30);
cmdSend.setLayoutData(fd); // 确定按钮事件
cmdSend.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
System.err.println("Login......."); she.dispose();
Switch.on_off = "on";

}
}
}); // 取消按钮
final Button cmdCancel = new Button(she, SWT.PUSH);
cmdCancel.setText(" Cancel ");
fd = new FormData();
fd.top = new FormAttachment(55);
fd.left = new FormAttachment(55);
cmdCancel.setLayoutData(fd); // 取消按钮事件
cmdCancel.addSelectionListener(new SelectionAdapter()
{
public void widgetSelected(SelectionEvent e)
{
System.exit(0);
}
});

she.open();
while (!she.isDisposed())
{
if (!dis.readAndDispatch())
{
dis.sleep();
}
}
dis.dispose();
}
}MainFrame.javapublic class MainFrame implements Runnable
{
Display dis; Shell shell; Text t1;// user import Text t2;// password import LoginGUI login; public MainFrame()
{
dis = new Display();
} public void login()
{
login = new LoginGUI(dis);
login.loginFrame();
} public void createMainFrame()
{
shell = new Shell(dis);
shell.setBounds(112, 34, 800, 600);
shell.setText(" FDH Testing");
shell.setImage(new Image(dis, "titleImage.ico"));
// main Menu
Menu menu = new Menu(shell, SWT.BAR);
shell.setMenuBar(menu); // file MenuItem
MenuItem file = new MenuItem(menu, SWT.CASCADE);
file.setText("&File"); Menu fileMenu = new Menu(shell, SWT.DROP_DOWN);
file.setMenu(fileMenu); // open MenuItem
MenuItem menuItem_open = new MenuItem(fileMenu, SWT.PUSH);
menuItem_open.setText("&Open"); // help MenuItem
MenuItem help = new MenuItem(menu, SWT.CASCADE);
help.setText("&Help"); Menu helpMenu = new Menu(shell, SWT.DROP_DOWN);
help.setMenu(helpMenu); // help Contents MenuItem
MenuItem menuItem_Contents = new MenuItem(helpMenu, SWT.PUSH);
menuItem_Contents.setText("Help Contents"); // about MenuItem
MenuItem menuItem_About = new MenuItem(helpMenu, SWT.PUSH);
menuItem_About.setText("&About");
} public void createLeft()
{
GridLayout gl = new GridLayout();
gl.numColumns = 3;
shell.setLayout(gl);
     
GridData gd = new GridData();
final Text t1 = new Text(shell, SWT.SINGLE | SWT.BORDER);
final Text t2 = new Text(shell, SWT.SINGLE | SWT.BORDER);
final Text t3 = new Text(shell, SWT.SINGLE | SWT.BORDER); gd = new GridData(GridData.FILL_HORIZONTAL);
t1.setLayoutData(gd); gd = new GridData(GridData.FILL_HORIZONTAL);
t2.setLayoutData(gd); gd = new GridData(GridData.FILL_HORIZONTAL);
t3.setLayoutData(gd);
} public void cancel()
{
shell.open();
while (!shell.isDisposed())
{
if (!dis.readAndDispatch())
{
dis.sleep();
}
}
dis.dispose();
} public void run()
{
while (true)
{
if (Switch.on_off.equals("on"))
{
System.out.println("Login Success......");
Switch.on_off = "off";
try
{
Thread.sleep(1000);
} catch (InterruptedException e)
{
e.printStackTrace();
}
createMainFrame();
createLeft();
cancel();
}
}
} /**
 * @param args
 */
public static void main(String[] args)
{
MainFrame main = new MainFrame();
Thread stakeout = new Thread(main);
stakeout.start();
main.login();
}
}这里我先说说我的思路:
  程序从mainframe 出开始 ,先从构造方法里面产生一个Display的对象
把这个对象传到 LoginGUi类中 产生登录界面 。
同事main方法里面启动一个线程来监控 登录界面是否成功登录
当成功登录就 调用方法 产生主界面现在的问题就是主界面不出来 哪位高人帮我看看?