2016-12-29 5 views
1

ich zur Zeit ein Programm entwickle, die einen Wert zwischen 100 und 355 an einen seriellen Anschluss mit einem Arduino verbunden mit RGB-LED-Streifen schicken.JSlider friert Programm

Das Programm arbeitet für ein wenig in Ordnung, aber dann friert plötzlich und ich kann keinen Schieber bewegen oder auf eine der Schaltflächen klicken.

Ich glaube, das liegt daran, dass das Programm zu viele Ereignisse verarbeitet, denn wenn ich die Schieber langsam bewege, passiert dieses Problem nicht so häufig, aber ich weiß nicht, wie ich die Anzahl der vom Schieberegler aktivierten Ereignisse verringern kann.

Hier ist mein Code für einen Schieber:

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(); 
     } 
    } 
}); 

hier ist mein neuer Code:

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

Senden von Daten geeignet ist, das Einfrieren nicht verursacht. Empfängt die Anwendung auch * Daten vom Swing Event-Thread? –

+0

............................ Hallo? –

Antwort

4

Es ist schwer, ohne Ihr volles Programm mit Sicherheit zu sagen, aber es scheint, Sie lesen und Schreiben von Daten aus dem ChangeListener.

Die Lese- und Schreiboperation Block für eine unbestimmte Zeit, während der die Event Dispatch Thread (EDT) keine zusätzlichen Ereignisse verarbeiten kann. Wenn Sie den EDT blockieren, wird Ihre GUI als eingefroren angezeigt.

Versuchen Sie einen anderen Thread Ausgründung die Lese-/Schreiboperation zu behandeln oder eine SwingWorker zu vermeiden, verwenden Sie das EDT blockieren.

(Aktualisieren Sie Ihre Post mit dem einen Minimal, Complete, and Verifiable example und ich werde versuchen, Ihnen einige speziellere Anleitung zu geben)

+1

ich würde hinzufügen: Wenn Sie benötigen, um zu bestimmen, ob Ihr Code auf dem Event Dispatch Thread ausgeführt wird, rufen Sie javax.swing.SwingUtilities.isEventDispatchThread. –

+0

Danke das hat mein Beitrag tadellos bearbeitet. – DiamondShark286