Java SWT从另一个线程更新画布
我正在开发一个Java应用程序,它基本上可以:Java SWT从另一个线程更新画布,java,multithreading,canvas,swt,Java,Multithreading,Canvas,Swt,我正在开发一个Java应用程序,它基本上可以: 在新线程中启动服务器。此服务器打开套接字连接并等待消息 使用画布(在主线程中)创建一个Shell,每当服务器收到消息时,我都需要使用其中包含的点绘制一条线 我已经阅读了一些关于这个问题的线程(关于从另一个线程更新SWT),并且我尝试创建一个由我的服务器在收到消息时调用的方法: public static void doPaint(final Canvas canvas, final Draw draw){ if (canvas
- 在新线程中启动服务器。此服务器打开套接字连接并等待消息
- 使用画布(在主线程中)创建一个Shell,每当服务器收到消息时,我都需要使用其中包含的点绘制一条线
public static void doPaint(final Canvas canvas, final Draw draw){
if (canvas != null && draw != null){
Display.getDefault().syncExec(new Runnable() {
@Override
public void run() {
canvas.addPaintListener(new PaintListener() {
@Override
public void paintControl(PaintEvent e) {
System.out.println("Printing line....");
e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_WHITE));
e.gc.setForeground(e.display.getSystemColor(SWT.COLOR_BLACK));
e.gc.setLineWidth(3);
e.gc.drawLine((int)draw.getStartX(),(int)draw.getEndX(),(int)draw.getStartY(),(int)draw.getEndY());
}
});
}
});
}
}
编辑
这是等待套接字消息并触发操作的循环:
while(isConnected()){
try{
System.out.println("Waiting for connection...");
Socket server = getServerSocket().accept();
BufferedReader in = new BufferedReader(new InputStreamReader(server.getInputStream(), Const.ENC_UTF8));
String inputLine;
while(((inputLine = in.readLine()) != null)){
processInput(inputLine, canvas);
}
}catch(IOException ioex){
System.out.println(ioex.getMessage());
ioex.printStackTrace();
}catch (Exception ex) {
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
我的processInput
方法是:
protected void processInput(String inputLine, Canvas canvas){
//get draw from input stream
Draw draw = DrawUtil.getDrawFromInput(inputLine);
//draw points on live-mode
BBCanvas.doPaint(canvas, draw);
//append draw node to XML file
DrawUtil.writeDrawToFile(draw);
}
。。。但是,doPaint
方法中的runnable永远不会执行。有什么提示吗
编辑2
这是创建主shell的代码:
public MainWindow(BBServer server) {
this.server = server;
Display display = new Display();
this.mainShell = createShell(display);
getMainShell().open();
while (!getMainShell().isDisposed()) {
if (!display.readAndDispatch()) {
display.sleep();
}
}
display.dispose();
}
我希望您必须采取一些措施,使画布在内存可用的情况下引发绘制事件调用。您是否尝试在侦听器中移动异步?@McDowell我已经编辑了我的问题,并添加了触发绘制事件的“事件”。@Baz我无法在侦听器中移动同步/异步,否则我会从SWT中得到一个异常,因为我正在尝试从另一个线程更新SWT组件。SWT的主事件循环(readAndDispatch)正在运行。