首页 文章

JFreeChart数据集不适用于JPanel

提问于
浏览
0

我有一个波纹管代码,它从MySQL调用数据并在JPanel上的XYPlot(JFreeChart)中返回 . 根据我的JTable的行索引,有不同的数据集 . 问题是当我选择一行时,图表似乎很好,但是当我选择另一行时,会出现XY图,但是当我点击(拖动,第二次鼠标点击等)时,图表会返回到第一行 . 实际上,每当我选择另一个绘图,并使用鼠标(缩放等)制作某些内容时,它将返回到主/第一个xyplot选择 . 我试过JPanel.validate();但仍然没有工作,也重绘();方法 . 此外,使用JFrame它工作得非常好,没有问题(是的!正确,因为每次使用特定的XYPlot时都会打开) . 我想这个问题来自JPanel . 有什么帮助/建议吗?请!

UPDATE: 带有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);
        }

    }

1 回答

  • 1

    我认为这可能是你的问题

    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);
    

相关问题