我有下面的代码,该代码从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);
        }

    }

最佳答案

我认为这可能是您的问题

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

关于java - JFreeChart数据集不适用于JPanel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13185921/

10-09 12:30