Обновление JFreeChart отображается как GraphicImage с PrimeFaces
Я работаю над веб-приложением, используя PrimeFaces. Я очень близок к решению, но я застрял при попытке обновить график по мере расчета новых данных. У меня есть 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, являются правильными, но тот, который появляется в веб-приложении, - нет. Я также попытался установить cache="FALSE" в graphicImage, но затем вместо графика я получил значок с разбитым изображением.
Я понимаю, что это говорит мне о том, что веб-приложение не получает последнее изображение, но почему?
1 ответ
Я столкнулся с проблемой на изображении, не обновлять тоже.
Попробуйте изменить область действия на @RequestScoped и добавить в cache="false" на p:graphicImage