SwingWorker中的Java EventListener

时间:2015-05-28 03:23:14

标签: multithreading user-interface serial-port swingworker

好的,所以我对Java中的SwingWorker有些新意。

我已经构建了一个Java GUI,当按下“开始”按钮时,会启动几个SwingWorker个线程。第一个线程只是跟踪运行时间并适当地更新GUI。第二个播放一系列声音文件。第三个(也是有问题的)线程应监视串行端口,以便稍后在路上操作传入数据。所有这些线程都将运行一段时间,因此它们是SwingWorkers

我正在使用jSSC库(https://code.google.com/p/java-simple-serial-connector/wiki/jSSC_examples)从串口读取数据,它通过触发eventListener来实现。

我的问题:SwingWorker线程内编写EventListener是多余/不优雅的?如果是这样,有没有更好的方法来解决这个问题?

以下是我的一些代码:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

    SerialPort serialPort = findPort(); // returns a serialport I can use to read data from.

    SwingWorker worker1 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            long elapsedTime, startTime = System.currentTimeMillis();
            while (true){
                Thread.sleep(1000);
                elapsedTime = (System.currentTimeMillis() - startTime)/1000;
                jTimeField.setText(String.format("%02d:%02d:%02d", elapsedTime/3600, (elapsedTime%3600)/60, elapsedTime%60));
                if (isCancelled()){} /* Check if thread has been canceled */
            }
        }
    };

    SwingWorker worker2 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            // This Thread: Plays music files; Self terminates; On termination also terminates worker 1 and 3 via cancel().
        }
    };

    SwingWorker worker3 = new SwingWorker<Void, Void>(){
        @Override
        protected Void doInBackground() throws Exception {
            serialPort.addEventListener(new SerialPortReader());
            return null;
        }
        class SerialPortReader implements SerialPortEventListener {

            @Override
            public void serialEvent(SerialPortEvent event) {
                byte buffer[];
                if (event.isRXCHAR() && event.getEventValue() > 0){
                    buffer = serialPort.readBytes();
                    for (byte b: buffer){
                        // Do stuff with incoming data
                    }
                }
            }
        }
    };
}

任何和所有建设性的批评都表示赞赏。

1 个答案:

答案 0 :(得分:0)

在你的swingworker线程中添加事件监听器然后在完成后返回它没有任何好处。为什么不直接添加EDT中的监听器,如果处理事件需要很长时间,则从那里启动处理线程?听取事件可能会阻塞,这会破坏整个观察者模式。