2016-12-29 98 views
1

我目前正在开发一个程序,它将发送一个介于100和355之间的值到串行端口,并带有一个Arduino连接到rgb LED灯带。JSlider冻结程序

程序工作正常,但突然冻结,我不能移动任何滑块或点击任何按钮。

我相信这是由于程序处理太多的事件,因为如果我缓慢地移动滑块,这个问题并不经常发生,但我不知道如何减少滑块激活的事件数量。

这里是我的一个滑块代码:

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     try { 
      output.flush(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
}); 

这是我的新代码:

redslide.addChangeListener(new ChangeListener() { 
    public void stateChanged(ChangeEvent arg0) { 
     int brightness = redslide.getValue(); 
     String message = "r" + brightness; 
     byte[] data = message.getBytes(); 
     new Thread(() -> Write(data)).start(); 
    } 
}); 

public static void Write(byte[] data){ 
     try { 
      output.write(data); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
+0

发送数据很可能不会造成冻结。应用程序是否也在Swing事件线程上接收数据? –

+0

............................你好? –

回答

4

很难肯定地说没有完整的计划,但似乎你正在阅读和写数据从ChangeListener

读取和写入操作块的时间不确定,在此期间Event Dispatch Thread (EDT)无法处理其他事件。阻止EDT将使您的GUI看起来被冻结。

尝试旋转另一个线程来处理读/写操作或使用SwingWorker来避免阻塞EDT。

(更新与一个Minimal, Complete, and Verifiable example你的帖子,我会尽力给你一些更具体的指导)

+1

我会补充:如果您需要确定您的代码是否在事件派发线程上运行,请调用javax.swing.SwingUtilities.isEventDispatchThread。 –

+0

感谢这工作完美编辑我的帖子。 – DiamondShark286