Наборы данных 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);