当前位置: 代码迷 >> Eclipse >> SWT界面假死的有关问题
  详细解决方案

SWT界面假死的有关问题

热度:24   发布时间:2016-04-23 13:56:18.0
SWT界面假死的问题
我做了一个简单的JAVA调用TOMCAT启动服务,界面用的SWT画的,点击启动服务菜单,TOMCAT正常启动,但是SWT界面就死掉了,请大家帮忙看一下,代码如下:
public class MainUI {

protected Shell shlDba = null;
Display display = Display.getDefault();

/**
* Launch the application.

* @param args
*/
public static void main(String[] args) {
try {
MainUI window = new MainUI();
window.open();
} catch (Exception e) {
e.printStackTrace();
}
}

/**
* Open the window.
*/
public void open() {
shlDba.open();
shlDba.layout();
while (!shlDba.isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}

}
shlDba.dispose();
display.dispose();
}

/**
*Close the window.
*/

public void close() {
if (!shlDba.isDisposed()) {
shlDba.close();
}
}

/**
* Create contents of the window.
*/
public MainUI() {

shlDba = new Shell();
shlDba.setSize(543, 602);
shlDba.setText("DBA自动化测试工具");

Menu menu = new Menu(shlDba, SWT.BAR);

shlDba.setMenuBar(menu);

MenuItem app = new MenuItem(menu, SWT.CASCADE);
app.setText("三层应用(APP)");

Menu menu_1 = new Menu(app);
app.setMenu(menu_1);

MenuItem start = new MenuItem(menu_1, SWT.NONE);
start.setText("启动服务");
start.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
// TODO Auto-generated method stub
try {
@SuppressWarnings("unused")
ServiceOperate start = new ServiceOperate(
"StartService.bat");
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}

}
});
  MenuItem mntmq = new MenuItem(menu, SWT.NONE);
mntmq.setText("退出(Q)");
mntmq.addSelectionListener((new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {

System.exit(0);
}
}));
MenuItem stop = new MenuItem(menu_1, SWT.NONE);
stop.setText("停止服务");
stop.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
try {
@SuppressWarnings("unused")
ServiceOperate tt = new ServiceOperate("StopService.bat");
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});

}
}

------解决方案--------------------
如果楼主你要是用非UI线程调用UI线程,SWT是不让的,你必须用UI线程调用,楼主可以试试,
我大概记得:
Java code
Display.getDefault().asyncExec(new Runnable(){    public void run(){});//或者Display.getDefault().syncExec(new Runnable(){    public void run(){});
------解决方案--------------------
java使用 ProcessBuilder 的start 方法启动一个程序,返回一个 Process,调用这个 process的 destory 方法,程序就结束了。
  相关解决方案