2015-01-22 2 views
2

У меня есть JTable, который отображает мои данные. Эти два JTable содержат две колонки (col1 для Time и col2 для значений датчика CO2). С нажатием кнопки «Пуск» данные будут добавлены в таблицу с периодом, через который я могу войти через консоль,JFreeChart Plot Динамически, когда изменения JTable

После каждого изменения таблицы Koordianten x = время, y = значения CO2, строка динамическая диаграмма должна быть показана.

Как я могу отобразить эту линейную линию динамически. Это мой код:

public PanelGraphic() throws NotConnectedException { 
    initComponents(); 
} 

private static JFreeChart createChart(final XYDataset dataset) { 
    JFreeChart chart = ChartFactory.createXYLineChart(
     "KohlendioxdeTest", "Time ", "CO2 (ppm)", dataset, 
     PlotOrientation.VERTICAL, false, false, false); 
    return chart; 
} 

private void display(){  
    JFreeChart chart = createChart(dataset); 
    ChartPanel panel = new ChartPanel(chart); 
    final XYPlot plot = (XYPlot) chart.getPlot(); 
    panel.setPreferredSize(new java.awt.Dimension(515, 265)); 
    PlGraph.setLayout(new java.awt.BorderLayout()); 
    PlGraph.add(panel, BorderLayout.CENTER); 
    PlGraph.validate();  
} 

private void jButtonStartActionPerformed(java.awt.event.ActionEvent evt) { 



final DefaultTableModel model = (DefaultTableModel) tbCO2Value.getModel(); 

try { 
if (!txtSetPeriode.getText().trim().isEmpty()) { 

double peri = Long.parseLong(txtSetPeriode.getText()); 
co2.setCO2CallbackPeriod((long) peri * 1000); 
co2.addCO2PPMListener(new BrickletCO2.PPmListener() { 

@Override 
public void PPmconverter(int kohlendioxide) { 
model.addRow(new Object[]{DisplayTime.getTime(), String.valueOf(kohlendioxide)}); 
} 
}); 
} else { 
lbComment.setText("Bitte geben sie die Periode ein"); 
} 


} catch (NotConnectedException ex) { 
Logger.getLogger(PanelGraphic.class.getName()).log(Level.SEVERE, null, ex); 
} catch (TimeoutException ex) { 
Logger.getLogger(PanelGraphic.class.getName()).log(Level.SEVERE, null, ex); 
} 

tbCO2Value.getModel().addTableModelListener(new MyTableModelListener(tbCO2Value)); 
dataset = new XYSeriesCollection(); 


XYSeries series = new XYSeries("CO2 (ppm)"); 
int nRow = tbCO2Value.getRowCount(); 
int nCol = tbCO2Value.getColumnCount(); 
Object[][] tableData = new Object[nRow][nCol]; 
for (int i = 0; i < nRow; i++) { 

tableData[i][0] = tbCO2Value.getValueAt(i, 0); 
tableData[i][1] = tbCO2Value.getValueAt(i, 1); 
// for (int i = 0; i < 10; i++) { 
series.add((double) tableData[i][0],(double) tableData[i][1]); 
} 
dataset.addSeries(series); 

display(); 

} 
class MyTableModelListener implements TableModelListener { 

JTable table; 

private MyTableModelListener(JTable table) { 
this.table = table; 
} 

@Override 
public void tableChanged(TableModelEvent e) { 

int firstRow = e.getFirstRow(); 
int lastRow = e.getLastRow(); 
int index = e.getColumn(); 

switch (e.getType()) { 
case TableModelEvent.INSERT: 
int nRow = tbCO2Value.getRowCount(); 
int nCol = tbCO2Value.getColumnCount(); 
Object[][] tableData = new Object[nRow][nCol]; 
for (int i = 0; i < nRow; i++) { 

tableData[i][0] = tbCO2Value.getValueAt(i, 0); 
tableData[i][1] = tbCO2Value.getValueAt(i, 1); 


} 
break; 

} 
} 
} 
} 
+0

Я надеюсь, что это сообщение поможет вам: http://stackoverflow.com/questions/11469865/making-dynamic-line-chart-using-jfree-chart-in-java – esprittn

+0

Также этот пример: обновление без нажатия кнопки http://dirtyhandsphp.blogspot.in/2012/07/how-to-draw-dynamic-line-or-timeseries.html – esprittn

ответ

2

Подобно тому, как JTable прислушивается к своим TableModel А.Н. XYPlot прислушивается к своему собственному XYDataset. В каждом случае просто обновите соответствующую модель, и соответствующее представление обновится в ответ. Используйте javax.swing.Timer для опроса вашего источника данных в размере, установленном выбранным периодом. Соответствующий пример показан here. В общих чертах, ваш таймер ActionListener может выглядеть следующим образом:

@Override 
public void actionPerformed(ActionEvent e) { 
    // poll the data source 
    model.add(Row(…); 
    dataset.add(…); 
} 

Если вы предполагаете латентность доступа к источнику данных, рассмотрите с помощью SwingWorker, иллюстрированных here и here.