0

我有一个用于绘制热图的 JavaFX 应用程序。该应用程序是在 Windows 10 机器上使用 Oracle 的 JDK 8 开发的。我正在使用 xchart-3.8.0.jar 库 ( https://knowm.org/downloads/xchart/xchart-3.8.0.zip ) 通过摆动节点绘制数据。

这是代码:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import javafx.scene.layout.VBox;
import javafx.scene.layout.Priority;
import javafx.embed.swing.SwingNode;

import org.knowm.xchart.HeatMapChart;
import org.knowm.xchart.HeatMapChartBuilder;
import org.knowm.xchart.XChartPanel;
import org.knowm.xchart.style.Styler;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;

public class XChartExample extends Application {

    @Override public void start(Stage stage) {
        VBox vBox = new VBox();

        stage.setTitle("Heatmap");
    
        HeatMapChart chart =
            new HeatMapChartBuilder().xAxisTitle("X").yAxisTitle("Y").theme(Styler.ChartTheme.Matlab).build();

        chart.getStyler().setShowWithinAreaPoint(true);
        chart.getStyler().setLegendPosition(Styler.LegendPosition.OutsideS);
        chart.getStyler().setLegendLayout(Styler.LegendLayout.Horizontal);

        chart.getStyler().setPlotContentSize(1);
        chart.getStyler().setShowValue(true);

        int[] xData = new int[5];
        xData[0] = 10;
        xData[1] = 20;
        xData[2] = 30;
        xData[3] = 40;
        xData[4] = 50;

        int[] yData = new int[5];
        yData[0] = 10;
        yData[1] = 20;
        yData[2] = 30;
        yData[3] = 40;
        yData[4] = 50;

        int[][] heatData = new int[5][5];
        for (int i = 0; i < 5; ++i) {
            for (int j = 0; j < 5; ++j) {
                heatData[i][j] = i + j;
            }
        }

        chart.addSeries("Basic HeatMap", xData, yData, heatData);
    
        SwingNode swingNode = new SwingNode();
        createAndSetSwingContent(swingNode, chart);
    
        vBox.getChildren().add(swingNode);
        VBox.setVgrow(swingNode, Priority.ALWAYS);
    
        Scene scene = new Scene(vBox, 500, 350);

        stage.setTitle("Demo");
        stage.setScene(scene);
        stage.show();
    }

    private void createAndSetSwingContent(SwingNode swingNode, HeatMapChart chart) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                   JPanel chartPanel = new XChartPanel<>(chart);
                   swingNode.setContent(chartPanel);
                }
            });
    }

    public static void main(String[] args) {
        launch(args);
    }
}

在运行应用程序时,我通常会看到以下黑色窗口:

黑窗

在稍微拖动窗口时,我得到了绘制图表的窗口:

图表

在某些情况下,在启动应用程序时,绘图会立即显示,而不会出现黑屏。在这种情况下,当我调整/移动窗口的大小时,黑屏可能会再次出现,我必须再次拖动窗口等等。

当应用程序在总显存为 4 MB 且未启用 3D 支持功能的虚拟机 (Windows 10) 上运行时,不会出现此问题。在这种情况下,应用程序运行正常,没有显示问题。

有没有办法避免这种行为?

4

0 回答 0