我有以下代码,它从MySQL调用数据并在JPanel上的XYPlot(JFreeChart)中返回。根据我的JTable的行索引,有不同的数据集。问题是当我选择一行时,图表似乎很好,但是当我选择另一行时,会出现XY图,但是当我点击(拖动,第二次鼠标点击等)时,图表会返回到第一行。实际上,每当我选择另一个绘图,并使用鼠标(缩放等)创建某些内容时,它将返回到主/第一个xyplot选择。 我试过JPanel.validate();但仍然没有工作,也重绘();方法。此外,使用JFrame它工作得非常好,没有问题(是的!正确,因为每次使用特定的XYPlot时都会打开)。我想这个问题来自JPanel。有什么帮助/建议吗?请!
UPDATE:带有XYPlot的JPanel封装在JSplitPanel中。当我移动分隔线(使用XYPlot放大JPanel)时,有两个XYPlot,第一个(在第一次点击时获得,第二个(如果第二次点击到另一行/数据集 - > XYPlot).I假设问题来自查询 - >并重新绘制上一个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);
}
}
答案 0 :(得分: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);