0

我正在使用 PrimeFaces 开发 Web 应用程序。我非常接近解决方案,但在计算新数据时尝试更新图表。我有 3 个选项卡:输入、输出和图表。在输入选项卡上,我有文本框和提交按钮。在输出选项卡上,我有一个数据图表来显示输入输入并单击提交后计算的数据。我已验证数据已正确填充。在“图表”选项卡上,我有一个图表(稍后将显示多个),它也用于显示计算中的数据。

这是我的相关代码:

public void createNewChart() {

    FileInputStream fis = null;
    try {
        //Graphic Text
        BufferedImage bufferedImg = new BufferedImage(100, 25, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bufferedImg.createGraphics();
        g2.drawString("This is a text", 0, 10);
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        ImageIO.write(bufferedImg, "png", os);
        graphicText = new DefaultStreamedContent(new ByteArrayInputStream(os.toByteArray()), "image/png");

        //Chart
        File chartFile = new File("C:\\Desktop\\Temp", "Chart" + Math.round(Math.random() * 1000000) + ".png");
        chartData = calculateValuesServlet.getChartData();
        calculateDataSets();

        XYSeriesCollection xyDataset = new XYSeriesCollection();
        xyDataset.addSeries(minumumLine);
        xyDataset.addSeries(maximumLine);
        xyDataset.addSeries(optimumLine);
        xyDataset.addSeries(ratingPoint);
        chart = ChartFactory.createXYLineChart("Chart Title", xAxis.getAxisLabel(), yAxis.getAxisLabel(), xyDataset, PlotOrientation.VERTICAL, true, false, false);
        fixRenderings();

        ChartUtilities.saveChartAsPNG(chartFile, chart, 375, 300);
        fis = new FileInputStream(chartFile);
        chartContent = new DefaultStreamedContent(fis, "image/png");
        calculateValuesServlet.setNewChartNeeded(false);
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (fis != null) {
                fis.close();
            }
        } catch (IOException ex) {
            Logger.getLogger(DataChart.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

另外,在我的 index.html 中:

<p:tab title="Charts">
    <h:panelGrid columns="2" cellpadding="10">
        <p:graphicImage  id="outputChart1" value="#{dataChart.chartContent}" />
    </h:panelGrid>
</p:tab>

为了完整起见,这是来自 DataChart.java:

public StreamedContent getChartContent() {
    if (chartData != null && !chartData.isEmpty() && calculateValuesServlet.isNewChartNeeded()) {
        createNewChart();
    }
    return chartContent;
}

我已经开始将图表保存到 Desktop\Temp 以便我可以查看图表。在我的 Temp 文件夹中创建的那些是正确的,但出现在 webapp 上的那个不是。我还尝试在图形图像中设置 cache="FALSE",但后来我得到一个损坏的图像图标而不是图形。

我意识到这告诉我 webapp 没有得到最新的图像,但为什么呢?

4

1 回答 1

0

我也面临图像不刷新的问题。

尝试将范围更改为 @RequestScoped 并在 p:graphicImage 上添加 cache="false"

于 2015-10-15T04:52:06.830 回答