JFreeChart 数据集不适用于 JPanel



我有bellow代码,该代码从mySQL调用数据,然后在jpanel上的xyplot(jfreechart)中返回。有不同的数据集,具体取决于我的JTable的行索引。问题是当我选择一行时,图表似乎很好,但是当我选择另一行时,xyplot出现了,但是当我单击(拖动,第二个鼠标单击等)时,图表返回到第一个。实际上,每当我选择另一个绘图时,我都会用鼠标(缩放等)做些东西,它会返回到主/第一个Xyplot选择。我尝试了jpanel.validate();但仍然不起作用,也重新涂抹();方法。此外,使用Jframe,它运行良好,没问题(是的!是的,因为每次使用特定Xyplot打开一个帧)。我想问题来自jpanel。有帮助/建议吗?请!

更新:带有Xyplot的JPanel被封装在JSPlitPanel中。当我移动分隔线(使用xyplot放大jpanel)时,有两个xyplot,第一个(在第一次单击时获得,第二次单击,如果第二次单击第二次到另一个行/数据集 -> xyplot)。我猜想该问题来自查询 ->并重新粉刷过上一个xyplot。

private void PrimaryTableMouseClicked(java.awt.event.MouseEvent evt) {                                          
        int row = PrimaryTable.getSelectedRow();
        int realIndex = PrimaryTable.convertRowIndexToModel(row);
        String Table_click = (PrimaryTable.getModel().getValueAt(realIndex, 0).toString());
        try {
            String query = "select wavenumber,spectrum FROM test where id_test ='" + Table_click + "'";
            pst = conn.prepareStatement(query);
            rs = pst.executeQuery();
            if (rs.next()) {
                JDBCXYDataset dataset = new JDBCXYDataset(ConnecrDb(), query);
                JFreeChart chart = ChartFactory.createXYLineChart(
                        "title",
                        "cm",
                        "in",
                        dataset,
                        PlotOrientation.VERTICAL,
                        false, //legend
                        true, //tooltip
                        false); //urls
                XYPlot plot = (XYPlot) chart.getPlot();
                ChartPanel CP = new ChartPanel(chart);
                PanelWithChart.setLayout(new BorderLayout());
                PanelWithChart.add(CP, BorderLayout.CENTER);
                PanelWithChart.repaint();
            }
             rs.close();
            pst.close();

        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

我认为这可能是您的问题

PanelWithChart.setLayout(new BorderLayout());
PanelWithChart.add(CP, BorderLayout.CENTER);

通过调用JPanel#add(),您每次调用PrimaryTableMouseClicked时都会添加一个新组件。如果您的ChartPanelPanelWithChart上唯一的组件,请尝试删除上图:

PanelWithChart.setLayout(new BorderLayout());
PanelWithChart.removeAll();
PanelWithChart.add(CP, BorderLayout.CENTER);

如果您在面板上有其他组件,这将行不通,如果是这种情况,则需要使用PanelWithChart.remove(Component comp),但是这很难,因为您没有参考上图。

请不要说这可能不是使用图表的最佳方法,您是否考虑过创建图表并使dataset成为一个预感?然后,您可以在PrimaryTableMouseClicked中使用此代码来实现效果。

dataset.removeAllSeries();
XYSeries newSeries = new XYSeries("New Data");
dataset.addSeries(newSeries);

相关内容

  • 没有找到相关文章

最新更新