【问题标题】:JFreeChart show one single valueJFreeChart 显示一个值
【发布时间】:2022-08-13 10:51:38
【问题描述】:

我有一个图表,其中显示了表格的值(股票和日期)。股票显示在 y 轴上,日期显示在 x 轴上。 只要查询返回 2 个条目,它通常会显示为一行,但如果查询只返回一个条目,则不会显示任何内容(那里应该有一个点)。

任何有关如何解决此问题的建议将不胜感激。

2 个条目:enter image description here

1 个条目:enter image description here

代码(图表内置在动作监听器中):

        historyButton.addActionListener(e -> {
        // stock list and dates list retrieved from database
            int articleNr = Integer.parseInt(articleIDText.getText());
            List<Integer> displayStockHistory;
            List<String> displayDatesStockHistory;

            try {
                displayStockHistory = business.displayStockHistory(articleNr);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
            try {
                displayDatesStockHistory = business.displayDatesStockHistory(articleNr);
            } catch (Exception ex) {
                throw new RuntimeException(ex);
            }
            DefaultCategoryDataset  dataset = new DefaultCategoryDataset();
            
            // add db values to the dataset
            for(int i = 0; i < displayStockHistory.size(); i++){
                dataset.addValue(displayStockHistory.get(i), \"Articles in Stock\", displayDatesStockHistory.get(i));
            }
            
            // compose chart
            JFreeChart chart = ChartFactory.createLineChart(
                    \"Stock History\",
                    \"Date\",
                    \"Stock\",
                    dataset,
                    PlotOrientation.VERTICAL,
                    true,
                    true,
                    false);

            chart.setBackgroundPaint(c2);
            chart.getTitle().setPaint(c3);

            CategoryPlot p = chart.getCategoryPlot();
            p.setForegroundAlpha(0.9f);

            CategoryItemRenderer renderer = p.getRenderer();
            //renderer.setSeriesPaint(0, c4);
            renderer.setSeriesStroke( 0, new BasicStroke( 5 ) );

            chart.getCategoryPlot().setBackgroundPaint(c1);
            ChartPanel chartPanel = new ChartPanel(chart);
            chartPanel.setBackground(c2);
            chartScrollPane.getViewport().add(chartPanel);
            chartPanel.setPreferredSize(new Dimension(2000, 270));
            ChartFrame frame1 = new ChartFrame(\"Line graph\", chart);

            frame1.setVisible(true);
            frame1.setSize(500, 400);
        });
    }

标签: java swing jfreechart


【解决方案1】:

您选择的图表工厂实例化了LineAndShapeRenderer,因此一种方法是使渲染器的形状对所有系列可见,如here 所示;请注意,API 有changed

CategoryPlot plot = (CategoryPlot) chart.getPlot();
LineAndShapeRenderer r = (LineAndShapeRenderer) plot.getRenderer();
r.setDefaultShapesVisible(true);

启用形状只要对于具有单个非空值的系列,您必须明确地遍历 data

DefaultCategoryDataset data = new DefaultCategoryDataset();
data.addValue(3, "Data1", LocalDate.now());
data.addValue(2, "Data2", LocalDate.now());
data.addValue(1, "Data2", LocalDate.now().plusDays(1));
…
for (int row = 0; row < data.getRowCount(); row++) {
    int count = 0;
    for (int col = 0; col < data.getColumnCount(); col++) {
        count += data.getValue(row, col) != null ? 1 : 0;
    }
    if (count == 1) {
        r.setSeriesShapesVisible(row, true);
    }
}

【讨论】:

  • 顺便说一句,因为java.time.LocalDateComparable,所以它可以直接用作列键。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-15
  • 2012-08-08
  • 1970-01-01
相关资源
最近更新 更多