0

我有下面的代码,它从 MySQL 调用数据并在 JPanel 上的 XYPlot (JFreeChart) 中返回。有不同的数据集,这取决于我的 JTable 的行索引。问题是当我选择一行时,图表似乎很好,但是当我选择另一行时,XYplot 出现但是当我单击(拖动,第二次鼠标单击等)时,图表返回到第一个. 几乎每次我选择另一个图时,我用鼠标做一些事情(缩放等),它都会返回到主要/第一个 xyplot 选择。我试过 JPanel.validate(); 但仍然无法正常工作,也 repaint(); 方法。此外,使用 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);
        }

    }
4

1 回答 1

1

我认为这可能是你的问题

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

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

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);
于 2012-11-02T09:49:17.793 回答