Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SWT从另一个线程更新画布_Java_Multithreading_Canvas_Swt - Fatal编程技术网

Java SWT从另一个线程更新画布

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

我正在开发一个Java应用程序,它基本上可以:

  • 在新线程中启动服务器。此服务器打开套接字连接并等待消息
  • 使用画布(在主线程中)创建一个Shell,每当服务器收到消息时,我都需要使用其中包含的点绘制一条线
我已经阅读了一些关于这个问题的线程(关于从另一个线程更新SWT),并且我尝试创建一个由我的服务器在收到消息时调用的方法:

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)正在运行。