Наборы данных JFreeChart не работают с JPanel

У меня есть ниже код, который вызывает данные из MySQL и возвращает в XYPlot (JFreeChart) на JPanel. Существуют разные наборы данных, в зависимости от индекса строки моего JTable. Проблема в том, что когда я выбираю строку, диаграмма кажется хорошей, но когда я выбираю другую строку, появляется XY-график, но когда я делаю щелчок (перетаскивание, второй щелчок мыши и т. Д.), Диаграмма возвращается к первой., Практически каждый раз, когда я выбираю другой график и делаю что-то с помощью мыши (масштабирование и т. Д.), Он возвращается к первичному / первому выбору ксиплота. Я пробовал JPanel.validate(); но все еще не работает, также перекрасить (); метод. Кроме того, с JFrame он работает очень хорошо, без проблем (да! Правильно, потому что каждый раз открывается один кадр с определенным XYPlot). Я полагаю, что проблема от JPanel. Любая помощь / совет? Пожалуйста!

ОБНОВЛЕНИЕ: JPanel с XYPlot инкапсулируется в JSplitPanel. Когда я перемещаю делитель (увеличиваем JPanel с помощью XYPlot), появляются два 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 ответ

Решение

Я думаю, что это может быть вашей проблемой

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);
Другие вопросы по тегам