Java 关闭xchart图表时防止关闭整个JVM
我正在使用xchart Java库,我正在创建一个图表,如下所示: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
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便利类中的一个错误,因为它会将一个框架交还给您,然后继续摆弄它。这不是人们可以合理预期的行为,也没有记录在案。好像已经有人去申请了