JFreeChart neu zeichnen sich Wenn Jtable sich ändert

Mohamed

Mitglied
Hallo Leute,
Ich bin gerade bei einemProjekt und dafür mus ich ein UI implementiere.
Problem:
Ich habe eine JTable die mir Daten anzeigt. Diese Jtable beinhalet zwei Column(Col1 für Zeit und Col2 für Werte von einem CO2 Sensor).
Am Amfang ist die
Mit einem click auf Start Button werde die Daten in der Tabelle mit einer Periode, die ich über den Konsole eingeben kann, hinzugefügt ,
Nach jeder Änderung in der Tabelle von der Koordianten x= Zeit und y=Co2 Werte, muss daraus ein LineChart dynamic dargestellt werden.

Wie kann ich diese Linechart Dynamic darstellen




ich habe versucht 7 Tage und Nächte das zu machen aber leider ohne Erfolg.


[FIELDSET=Code]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[0] = tbCO2Value.getValueAt(i, 0);
tableData[1] = tbCO2Value.getValueAt(i, 1);
// for (int i = 0; i < 10; i++) {
series.add((double) tableData[0],(double) tableData[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[0] = tbCO2Value.getValueAt(i, 0);
tableData[1] = tbCO2Value.getValueAt(i, 1);


}



break;

}
}

}
} [/FIELDSET]
 

Anhänge

  • UserInterface.png
    UserInterface.png
    72,6 KB · Aufrufe: 39
  • UserInterface.jpg
    UserInterface.jpg
    76,7 KB · Aufrufe: 38
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Sowohl JfreeChart als auch eine JTable verwenden das MVC-Konzept, d. h. es gibt eine Trennung zwischen Klassen mit Daten (Model) und Klassen zum Anzeigen (View). Du musst lediglich ein Objekt erstellen, welches als Model für sowohl einen JFreeChart als auch eine JTable dienen kann. In deinem Fall bedeutet das: ein Objekt, welches sowohl ein XYDataset als auch ein TableModel ist.
Um nicht beide Interfaces von Grund auf neu implementieren zu müssen, biten sich Wrapper an, die ein Interface über die Methoden des anderean ansprechbar machen. JFreeChart bietet selber einen solchen Wrapper an: die Klasse org.jfree.data.xy.XYDatasetTableModel. Sie benötigt eine Instanz von org.jfree.data.xy.TableXYDataset, die als Spezialisierung von XYDataset voraussetzt, daß alle Datenpunkte mit gleichem Index einen identischen x-Wert haben. Eine Implementierung von TableXYDataset für eine zweispaltige Tabelle, bei der man nachträglich noch Punkte anfügen kann, ist nicht besonders schwierig:
Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.util.ArrayList;
import org.jfree.chart.ChartPanel;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.Range;
import org.jfree.data.xy.AbstractXYDataset;
import org.jfree.data.xy.TableXYDataset;
import org.jfree.data.xy.XYDatasetTableModel;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class TableAndChart {

    public static void main(String[] args) {
        JFrame frame = new JFrame("Table and Chart");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        PointList dataset = new PointList("Daten");
        ValueAxis xAxis = new NumberAxis("x");
        ValueAxis yAxis = new NumberAxis("y");
        xAxis.setRange(new Range(0, 500));
        yAxis.setRange(new Range(0, 500));
        xAxis.setAutoRange(false);
        yAxis.setAutoRange(false);
        XYPlot plot = new XYPlot(dataset, xAxis, yAxis, new XYLineAndShapeRenderer());
        JFreeChart chart = new JFreeChart(plot);
        frame.getContentPane().add(new ChartPanel(chart));
        JTable table = new JTable(new XYDatasetTableModel(dataset));
        JScrollPane scroll = new JScrollPane();
        scroll.getViewport().setPreferredSize(new Dimension(160, 500));
        scroll.setViewportView(table);
        frame.getContentPane().add(scroll, BorderLayout.EAST);
        frame.pack();
        frame.setVisible(true);
        for (int i = 0; i < 500; i++) {
            try {
                Thread.sleep(20);
            } catch (InterruptedException ie) {
            }
            dataset.addPoint(i, i);

        }
    }

    static class PointList extends AbstractXYDataset implements TableXYDataset {

        private ArrayList<Double[]> points = new ArrayList<Double[]>();
        private Comparable key;

        public PointList(Comparable key) {
            this.key = key;
        }

        public Comparable getSeriesKey(int index) {
            return key;
        }

        public int getSeriesCount() {
            return 1;
        }

        public int getItemCount(int series) {
            return points.size();
        }

        public int getItemCount() {
            return points.size();
        }

        @Override
        public double getXValue(int series, int item) {
            return points.get(item)[0].doubleValue();
        }

        @Override
        public double getYValue(int series, int item) {
            return points.get(item)[1].doubleValue();
        }

        public Number getX(int series, int item) {
            return points.get(item)[0];
        }

        public Number getY(int series, int item) {
            return points.get(item)[1];
        }

        public void addPoint(double x, double y) {
            points.add(new Double[]{new Double(x), new Double(y)});
            fireDatasetChanged();
        }
    }
}
 
Zuletzt bearbeitet:

Mohamed

Mitglied
habe ich versucht mit dem oben geposteten Code weiterzuarbeiten damit ich weiterkomme kann , aber das Problem passiert nicht und in der Tabelle wird nur ein Row angezeigt und bricht das Code ab.

Geänderter Code;
Java:
private void jButtonStartActionPerformed(java.awt.event.ActionEvent evt) {                                             

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

        final PointList dataset = new PointList("Daten");
        ValueAxis xAxis = new NumberAxis("x");
        xAxis.setAutoRange(true);
        xAxis.setFixedAutoRange(6000.0);

        ValueAxis yAxis = new NumberAxis("y");
        yAxis.setRange(0.0, 1500.0);
        XYPlot plot = new XYPlot(dataset, xAxis, yAxis, new XYLineAndShapeRenderer());
        JFreeChart chart = new JFreeChart(plot);
        ChartPanel panel = new ChartPanel(chart);

        panel.setPreferredSize(new java.awt.Dimension(515, 265));
        XYDatasetTableModel tbCO2Value = new XYDatasetTableModel(dataset);
        JTable table = new JTable(tbCO2Value);
        PlGraph.setLayout(new java.awt.BorderLayout());
        PlGraph.add(panel, BorderLayout.CENTER);
        PlGraph.validate();

try {
                co2.setCO2CallbackPeriod(peri * 1000);
            } catch (NotConnectedException | TimeoutException ex) {
                Logger.getLogger(PanelGraphic.class.getName()).log(Level.SEVERE, null, ex);
            }
            if (listener == null) {
                listener = new BrickletCO2.PPmListener() {

                    @Override
                    public void PPmconverter(int kohlendioxide) {

                        model.addRow(new Object[]{DisplayTime.getTime(), String.valueOf(kohlendioxide)});

                        System.out.println(" Time ist -> " + DisplayTime.getTime() + " co2 beträgt :" + String.valueOf(kohlendioxide));

                     double time = Double.parseDouble(DisplayTime.getTime());
                   dataset.addPoint(time, (double) kohlendioxide);
                  
                      
                    }
                };

                co2.addCO2PPMListener(listener);
            }
}

hier sit die angezeigte Fehlermeldung

run:
Exception in thread "Callback-Processor" java.lang.NumberFormatException: For input string: "12:30:43"
at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2043)
at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:538)
at MyFrames.Panels.PanelGraphic$6.PPmconverter(PanelGraphic.java:333)

Time ist -> 12:30:43 co2 beträgt :1374




die Zeile PanelGraphic.java:333 weist darauf hin ->

double time = Double.parseDouble(DisplayTime.getTime());
dataset.addPoint(time , (double) kohlendioxide);
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Bei dem String "12:30:43" handelt es sich offenbar um eine Zeitangabe. Diese kann natürlich nicht direkt in einen double-Wert umgewandelt werden.
Du musst offenbar ein SimpleDateFormat verwenden:
Java:
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
double value = sdf.parse(DisplayTime.getTime()).getTime();
Ausserdem rate ich nochmals dazu, die Trennung zwischen dem XYDataset und dem TableModel aufzuheben. Dadurch vermeidest du doppelte Datenhaltung und musst dich nicht mehr um die Synchronisation kümmern.,
 
Zuletzt bearbeitet:

Mohamed

Mitglied
Danke Harry für deine Hilfe.

Diese Double value variable gibt die Zeit als double Wert zurück und nicht das Format die ich eingegeben habe und die ich bauche ("HH:mm:ss").
wie kann ich machen dass trotz die value-Variable als double ist, dass er dieses Format ("HH:mm:ss") anzeigt.
Das Problem liegt in dieser Methode dass alle Variable als double deklarieret sind

Java:
public void addPoint(Double x, Double y) {
            points.add(new Double[]{new Double(x), new Double(y)});
            fireDatasetChanged();
        }
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Ich sehe da zwei grundsätzliche Möglichkeiten:
1. Du speicherst wie bisher die Zeitangaben als double (oder Double) und wandelst sie mit einem geeigneten TableCellRenderer in einen String mit dem gewünschten Format um.
2. Du speicherst die Zeitangaben als String und wandelst sie in der getX()-Methode aus der PointList in eine Zahl um.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JFreeChart neu zeichnen sich das Datenset geändert hat. AWT, Swing, JavaFX & SWT 4
C JFreeChart X-Achse Werte skalieren, begrenzen, zoomen AWT, Swing, JavaFX & SWT 5
H JFreeChart BarDiagramm Balken der gleichen Serie unterschiedliche Farbe zuordnen AWT, Swing, JavaFX & SWT 2
H JFreeChart - DemoDataSetFactory Probleme AWT, Swing, JavaFX & SWT 1
H JFreeChart Charts überlagern AWT, Swing, JavaFX & SWT 2
C JFreeChart x-Achse mit absteigenden Werten AWT, Swing, JavaFX & SWT 1
K JFreeChart nicht ohne BarChartDemo startklar? AWT, Swing, JavaFX & SWT 5
T 2D-Grafik JFreeChart mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
D Swing JFreeChart Crosshair Label - setPreferredSize oder ähnliches, aber wo ? AWT, Swing, JavaFX & SWT 1
N jFreeChart einzelne Punkte anwählen und Formatieren AWT, Swing, JavaFX & SWT 0
B JFreeChart Gantt Höhe Tasks AWT, Swing, JavaFX & SWT 1
V JFreeChart: Tooltip auf Knopfdruck anzeigen AWT, Swing, JavaFX & SWT 2
V JFreechart: In Linechart Linien einzeichnen und Bereiche färben AWT, Swing, JavaFX & SWT 4
M In JFreeChart Geraden erzeugen AWT, Swing, JavaFX & SWT 11
M JFreechart Zoom out AWT, Swing, JavaFX & SWT 2
M Swing JFreechart X-Achse Tick auslesen AWT, Swing, JavaFX & SWT 13
M Swing JFreechart zoom x-achse neue Werte AWT, Swing, JavaFX & SWT 4
Z Diagramm mit jfreechart quadratisch erstellen AWT, Swing, JavaFX & SWT 1
D JFreeChart range der Y Achse verändern. AWT, Swing, JavaFX & SWT 1
G JFreeChart - SetSeriesColor Problem AWT, Swing, JavaFX & SWT 3
K 2D-Grafik JFreeChart plot.setBackgroundImage() AWT, Swing, JavaFX & SWT 1
K 2D-Grafik JFreeChart DateAxis AWT, Swing, JavaFX & SWT 9
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
D JFreeChart - aktuelle code beispiele AWT, Swing, JavaFX & SWT 11
M JFreeChart in ein File schreiben (bzw. JFrame in ein File Schreiben) AWT, Swing, JavaFX & SWT 2
A JFreeChart in GUI AWT, Swing, JavaFX & SWT 3
E JFreeChart: Timeseries-Chart und Area-Chart "überlappen" lassen AWT, Swing, JavaFX & SWT 6
B JFreeChart-Erweiterungen AWT, Swing, JavaFX & SWT 4
E JFreeChart in einer dynamischen Aufzeichnung neue Serien hinzufügen? AWT, Swing, JavaFX & SWT 7
I XML - JFreeChart AWT, Swing, JavaFX & SWT 15
N Dynamische JFreechart updated UI nicht AWT, Swing, JavaFX & SWT 5
S JFreeChart - Schriftgröße der Legende AWT, Swing, JavaFX & SWT 2
O Swing JFreechart subtitle formatieren AWT, Swing, JavaFX & SWT 3
N JFreeChart: Plot soll mit skalieren AWT, Swing, JavaFX & SWT 5
R JFreeChart Plots AWT, Swing, JavaFX & SWT 6
J JFreechart spezielles Balkendiagramm AWT, Swing, JavaFX & SWT 2
R JFreeChart: nur jeden n-ten Wert auf der X-Achse anzeigen AWT, Swing, JavaFX & SWT 5
R JFreeChart aktualisieren wenn sich die Ausgangsdaten ändern AWT, Swing, JavaFX & SWT 8
T JFreeChart Linine einzeichnen AWT, Swing, JavaFX & SWT 2
M JFreeChart Ausrichtung der Balken AWT, Swing, JavaFX & SWT 2
R jFreeChart in eine NetBeans Projekt integrieren AWT, Swing, JavaFX & SWT 24
D JFreeChart Breite (width) ändern AWT, Swing, JavaFX & SWT 6
A Swing JFreeChart, Gantt, Schichtplan AWT, Swing, JavaFX & SWT 3
R JFreeChart Skalierung zur Laufzeit ändern AWT, Swing, JavaFX & SWT 7
F Wie lade ich eine CategoryDataset aus XML ins JFreeChart? AWT, Swing, JavaFX & SWT 9
J JFreeChart - mehrere Y-Achsen AWT, Swing, JavaFX & SWT 2
A JFreeChart: 2 X-Achsen für ein Dataset AWT, Swing, JavaFX & SWT 2
T JFreeChart export Problem AWT, Swing, JavaFX & SWT 4
S JFreeChart Achse immer sichtbar AWT, Swing, JavaFX & SWT 2
D JFreechart maximalangezeigter Wertebereich AWT, Swing, JavaFX & SWT 3
B AWT [JFreeChart] malt nicht so wie ich will :-( AWT, Swing, JavaFX & SWT 2
B JFreeChart Balkendiagramm ActionEvent AWT, Swing, JavaFX & SWT 2
L Labels sichtbar - JFreeChart AWT, Swing, JavaFX & SWT 5
A Schachbrettartiges Diagramm mit JFreeChart AWT, Swing, JavaFX & SWT 4
E JFreeChart AWT, Swing, JavaFX & SWT 2
L Gantt Chart - JFreeChart AWT, Swing, JavaFX & SWT 5
K JFreeChart im JScrollPane ausblenden AWT, Swing, JavaFX & SWT 2
L JFreeChart Labelrotation AWT, Swing, JavaFX & SWT 2
L JFreeChart Farbe von Balken AWT, Swing, JavaFX & SWT 5
L JFreeChart Balkenanordnung AWT, Swing, JavaFX & SWT 10
L JFreeChart Achsenskalierung AWT, Swing, JavaFX & SWT 4
L JFreeChart - Dataset befüllen AWT, Swing, JavaFX & SWT 2
L JFreeChart - Line Shapes AWT, Swing, JavaFX & SWT 15
N JFreeChart - Basics AWT, Swing, JavaFX & SWT 2
L NullPointerException JFreeChart AWT, Swing, JavaFX & SWT 10
L JFreeChart - Legende vertikal AWT, Swing, JavaFX & SWT 5
L JFreeChart - Linienstärke einstellen AWT, Swing, JavaFX & SWT 2
L JFreeChart Einstellungen AWT, Swing, JavaFX & SWT 22
L JFreeChart - Gitterfarbe schwarz AWT, Swing, JavaFX & SWT 4
L JFreeChart StackedBar + Line-Chart kombinieren AWT, Swing, JavaFX & SWT 4
L JFreeChart - Performance bei PNG-Erstellung AWT, Swing, JavaFX & SWT 5
L JFreeChart - Legende beliebig positionieren AWT, Swing, JavaFX & SWT 16
G JFreechart Balken einfärben AWT, Swing, JavaFX & SWT 6
F Probleme mit NumberAxis bei JFreeChart AWT, Swing, JavaFX & SWT 5
G jfreechart (Diagramm speichern mit ein vorgegebenen Namen) AWT, Swing, JavaFX & SWT 6
K JFreeChart Eigentschaften des Charts ändern AWT, Swing, JavaFX & SWT 8
G JFreeChart und das updaten AWT, Swing, JavaFX & SWT 7
G Ausser Jfreechart, Chart Programme? AWT, Swing, JavaFX & SWT 11
S Dimensionen JFreeChart AWT, Swing, JavaFX & SWT 5
S JFreeChart Stufendiagramm AWT, Swing, JavaFX & SWT 2
H Problem beim zeichen eines TimeSeriesChart mit jfreechart AWT, Swing, JavaFX & SWT 5
K JFreeChart: Platz zwischen Balken AWT, Swing, JavaFX & SWT 3
M JFreeChart Handbuch? AWT, Swing, JavaFX & SWT 8
P JFreeChart - TimeSeriesDiagram AWT, Swing, JavaFX & SWT 2
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX Canvas neu zeichnen anstoßen AWT, Swing, JavaFX & SWT 34
H Transparent zeichnen mit drawImage in paintComponent Methode AWT, Swing, JavaFX & SWT 3
N JavaFX Unicode zeichnen in javafx Label verwenden AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
S Event Handling Neu zeichnen nur wenn Berechnung fertig ist AWT, Swing, JavaFX & SWT 4
W JavaFX Ich kann keinen Kreis richtig zeichnen AWT, Swing, JavaFX & SWT 8
CptK Funktionsgraphen effizient zeichnen und nur Teile von JPanel erneuern AWT, Swing, JavaFX & SWT 2
G Dreieck aus Pixeln zeichnen AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
B 2D-Grafik paintcomponent Probleme beim zeichnen AWT, Swing, JavaFX & SWT 10
Z Swing Graph zeichnen lassen AWT, Swing, JavaFX & SWT 16
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben