Java 关闭xchart图表时防止关闭整个JVM

Java 关闭xchart图表时防止关闭整个JVM,java,swing,Java,Swing,我正在使用xchart Java库,我正在创建一个图表,如下所示: XYChart chartHR = QuickChart.getChart("Title", "Time", "y", "randomWalk", new double[] { 0 }, new double[] { 0 }); chartHR.getStyler().setLegendVisible(false); chartHR.getStyler().setXAxisTick

我正在使用xchart Java库,我正在创建一个图表,如下所示:

        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);
XYChart chartr=QuickChart.getChart(“Title”、“Time”、“y”、“randomWalk”、新双精度[]{0}、新双精度[]{0});
chartHR.getStyler().setLegendVisible(false);
chartHR.getStyler().setXAxisTicksVisible(false);
SwingWrapper swHR=新的SwingWrapper(chartHR);
swHR.displayChart().setDefaultCloseOperation(JFrame.DO\u NOTHING\u ON\u CLOSE);
我正在从我的主类启动的线程中创建此图表。每次我关闭图表时,我的整个应用程序都会关闭。我怎样才能防止呢

以下是最简单的工作示例:

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) {}
    }
}
封装测试;
导入java.util.Scanner;
公开课考试{
公共静态void main(字符串[]args){
TestThread TestThread=新的TestThread();
testThread.start();
字符串输入=”;
扫描仪=新的扫描仪(System.in);
而(!input.equals(“q”)){
系统输出打印(“输入'q'表示终止”);
输入=scanner.nextLine();
}
scanner.close();
}
}
包装试验;
导入javax.swing.JFrame;
导入org.knowm.xchart.QuickChart;
导入org.knowm.xchart.SwingWrapper;
导入org.knowm.xchart.XYChart;
公共类TestThread扩展线程{
私人SwingWrapper swHR;
私有XYChart chartHR;
公开募捐{
chartHR=QuickChart.getChart(“测试”、“时间”、“y”、“随机行走”、新双精度[]{0}、新双精度[]{0});
chartHR.getStyler().setLegendVisible(false);
chartHR.getStyler().setXAxisTicksVisible(false);
swHR=新的摇摆器(chartHR);
swHR.displayChart().setDefaultCloseOperation(JFrame.DO\u NOTHING\u ON\u CLOSE);
while(true){}
}
}

如果检查源代码,SwingWrapper将为EDT上的JFrame设置默认关闭操作。如果不是,则设置该值,然后将覆盖该值。要解决此问题,请将您的更改发布到EDT,它应该可以工作

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

这应该放在队列中,在SwingWrapper进行更改后发生。

确保您的所有线程都不是刚刚完成,也许?你应该发布一个@pvg,我已经添加了一个示例。你应该阅读这篇文章,你不需要额外的线程来开始(通常不应该子类化线程),你应该从事件调度线程进行gui设置。这是图表库所做的,但您没有。您最终将处于竞争状态,您的更改发生在更改
displayChart
之前。可以说,这是xchart便利类中的一个错误,因为它会将一个框架交还给您,然后继续摆弄它。这不是人们可以合理预期的行为,也没有记录在案。好像已经有人去申请了