2016-12-29 101 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