2017-06-27 5 views
1

Schließen ich die xchart Bibliothek für Java und bin mit Ich erstelle ein Diagramm wie folgt:Schließen Prevent ganze JVM wenn xchart Diagramm

 XYChart chartHR = QuickChart.getChart("Title", "Time", "y", "randomWalk", new double[] { 0 }, new double[] { 0 }); 
     chartHR.getStyler().setLegendVisible(false); 
     chartHR.getStyler().setXAxisTicksVisible(false); 
     SwingWrapper<XYChart> swHR = new SwingWrapper<XYChart>(chartHR); 
     swHR.displayChart().setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

ich diese Grafik in einem von meinem Haupt-gestartete Thread zu schaffen Klasse. Jedes Mal, wenn ich das Diagramm schließe, ist meine gesamte Bewerbung geschlossen. Wie kann ich das verhindern?

Hier ist das minimale Arbeitsbeispiel:

package test; 

import java.util.Scanner; 

public class Test { 

    public static void main(String[] args) { 
     TestThread testThread = new TestThread(); 
     testThread.start(); 

     String input = ""; 
     Scanner scanner = new Scanner(System.in); 
     while (!input.equals("q")) { 
      System.out.print("Enter 'q' for termination."); 
      input = scanner.nextLine(); 
     } 
     scanner.close(); 
    } 

} 

package test; 

import javax.swing.JFrame; 

import org.knowm.xchart.QuickChart; 
import org.knowm.xchart.SwingWrapper; 
import org.knowm.xchart.XYChart; 

public class TestThread extends Thread { 

    private SwingWrapper<XYChart> swHR; 
    private XYChart chartHR; 

    public void run() { 
     chartHR = QuickChart.getChart("Test", "Time", "y", "randomWalk", new double[] { 0 }, new double[] { 0 }); 
     chartHR.getStyler().setLegendVisible(false); 
     chartHR.getStyler().setXAxisTicksVisible(false); 
     swHR = new SwingWrapper<XYChart>(chartHR); 
     swHR.displayChart().setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 

     while(true) {} 
    } 
} 
+0

Stellen Sie sicher, dass alle Threads nicht nur fertig sind, vielleicht? Sie sollten einen [MCVE] – pvg

+0

@pvg posten Ich habe ein Beispiel hinzugefügt – machinery

+0

Sie sollten dies lesen https://docs.oracle.com/javase/tutorial/uiswing/concurrency/ Sie brauchen den zusätzlichen Thread nicht zu beginnen (Im Allgemeinen sollten Sie Thread nicht von der Unterklasse ableiten und Sie sollten Ihre GUI-Einrichtung über den Ereignisversand-Thread durchführen. Dies ist, was die Diagrammbibliothek tut, aber Sie nicht. Sie landen in einem Race-Zustand, in dem Ihre Änderung vor der Änderung 'displayChart' stattfindet. – pvg

Antwort

2

Wenn Sie den Quellcode überprüfen, die SwingWrapper legt den Standardschließvorgang für die JFrame am EDT. Du bist nicht, also stellst du den Wert ein, dann wird er überschrieben. Um dies zu beheben, posten Sie Ihre Änderung in den EDT und es sollte funktionieren.

JFrame frame = swHR.displayChart(); 
javax.swing.SwingUtilities.invokeLater(
    ()->frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE) 
); 

Das sollte in die Warteschlange gehen und passieren, nachdem die Änderungen der SwingWrapper macht.

Verwandte Themen