0

MySQL からデータを呼び出し、JPanel の XYPlot (JFreeChart) で返す次のコードがあります。JTable の行インデックスに応じて、さまざまなデータセットがあります。問題は、行を選択するとグラフが適切に見えるのですが、別の行を選択すると XYplot が表示されますが、クリック (ドラッグ、マウスの 2 回目のクリックなど) を行うと、グラフが最初のグラフに戻ります。 . ほとんどの場合、別のプロットを選択してマウスで何かを作成すると (ズームなど)、プライマリ/最初の xyplot 選択に戻ります。JPanel.validate(); を試しました。それでも機能しません。また、repaint(); 方法。さらに、JFrame では非常にうまく機能しており、問題はありません (そうです、特定の XYPlot で毎回 1 つのフレームが開くためです)。問題はJPanelにあると思います。ヘルプ/アドバイスはありますか?お願いします!

更新: XYPlot を使用した JPanel は、JSplitPanel にカプセル化されています。分割線を移動すると (JPanel を XYPlot で拡大)、2 つの XYPlot があり、最初の 1 つ (最初のクリックで取得) と 2 つ目 (別の行/データセットに 2 回クリックした場合 -> 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 に答える