SWT 关于 在一个类中调用另一个类的方法
要做一个管理系统,目前只有两个类:Logon.java(登录界面)和Opboard.java(操作界面).
/*-------------------------Logon.java-----------------------------*/
public class Logon {
.
.
.
public Logon() {
final Button okButton = new Button(shell, SWT.NONE);
okButton.setText( "确定 ");
okButton.setBounds(105, 120, 44, 23);
okButton.addSelectionListener(new SelectionListener(){public void widgetSelected(SelectionEvent e){
if(e.getSource()==okButton){
if((text.getText().equals( "root "))&&(text2.getText().equals( "admin "))){
System.out.println( "mark1 "); //mark1
// 实例化Opboard
Opboard app=new Opboard();
System.out.println( "mark2 "); //mark2
//调用start()方法
app.start();
}
}
}
public void widgetDefaultSelected(SelectionEvent e){
}
});
}
public void start() {
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public static void main(String[] args) {
Logon log = new Logon(10,2);
log.start();
}
}
/*-----------------------------Opboard.java-----------------------------*/
public class Opboard {
//一些定义
public Opboard(){
//一些定义
}
public void start(){
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
public static void main(String args[]){
Opboard app=new Opboard();
app.start();
}
}
运行之后 mark1出现,mark2没出现
pams是包名
报错:
Exception in thread "main " org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3374)
at org.eclipse.swt.SWT.error(SWT.java:3297)
at org.eclipse.swt.SWT.error(SWT.java:3268)
at org.eclipse.swt.widgets.Display.checkDisplay(Display.java:646)
at org.eclipse.swt.widgets.Display.create(Display.java:707)
at org.eclipse.swt.graphics.Device. <init> (Device.java:129)
at org.eclipse.swt.widgets.Display. <init> (Display.java:402)
at org.eclipse.swt.widgets.Display. <init> (Display.java:393)
at pams.Opboard. <init> (Opboard.java:32)
at pams.Logon$2.widgetSelected(Logon.java:71)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:90)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:928)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3348)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:2968)
at pams.Logon.start(Logon.java:105)
at pams.Logon.main(Logon.java:114)
[解决办法]
swt控件要在UI线程中调用
[解决办法]
顶一下
[解决办法]
可以换个思路:
关闭登录界面,打开操作界面。
1、将登录界面shell重构为login,将操作界面shell重构为main;
2、在login中开一线程,打开main;
Opboard app=new Opboard();
app.open();
3、关闭登录界面:
login.close();
[解决办法]
换成下面的方式?
Display display = Display.getDefault();
Shell shell = new Shell(display);
boolean isLogin = new LoginShell(shell).open();//登錄介面
if (isLogin)
{
ApplicationWindow w = new ApplicationWindow(shell);
w.setBlockOnOpen(true);
w.open();
Display.getCurrent().dispose();
shell.dispose();
display.dispose();
}
else
{
shell.dispose();
display.dispose();
}
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}