JFreeChart Skalierung zur Laufzeit ändern

RainerUnsinn

Mitglied
Hallo Forengemeinde,

ich bin gerade dabei mit JFreeChart ein TimeSeries Diagramm zu erstellen, welches momentan noch Zufallszahlen und später Sensorwerte in Abhängigkeit der Zeit darstellen soll. Das funktioniert bisher auch ganz gut. Allerdings würde ich gerne während sich das Diagramm dynamisch aktualisiert über eine JCombobox die Skalierung der Zeitachse ändern. Ich habe aber keine Idee wie ich das umsetzen soll. Über die axis.setFixedAutoRange() müste ja die Skalierung geholt werden, was aber nur zu Beginn beim erstellen des Diagramms geschieht. Wie kann ich also zur Laufzeit die axis.setFixedAutoRange() aktualisieren? Wäre schön wenn jemand einen Hinweis hat. Vielen Dank.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Hallo Rainer,
vielleicht habe ich da was nicht verstanden. Was hindert dich daran, setFixedAutoRange(double length) zu einem von dir gewählten Zeitpunkt aufzurufen?
Das double Argument kannst du dir aus einer JComboBox, einem JTextField oder aus einem JSpinner holen. Du müsstest an diese Komponenten nur einen geeigneten Listener hängen, der auch eine Referenz zu der domain axis hat, und wenn die Komponente einen event losschickt, weil der Benutzer damit rumgespielt hat, setFixedAutoRange(double) auf der domain aixis aufrufen.
 

RainerUnsinn

Mitglied
Hallo Harry,

erst einmal vielen Dank für deine Antwort. Das double Argument hole ich auch aus einer JComboBox. Nur wie rufe ich die setFixedAutoRange(double) auf? Ich habe das ganze über ein MVC Pattern gelöst. Die JComboBox wird auch vom Controller ausgelesen. Dann schicke ich den Wert zur View zurück. Nur dann weiß ich nicht wie es weiter gehen soll. Wäre dir für einen Hinweis sehr dankbar. Der Code dazu. Hier wird das Diagramm erstellt:
Java:
 public JFreeChart createChart(final XYDataset dataset) {
        final JFreeChart result = ChartFactory.createTimeSeriesChart(
            null, 			//Titel Diagramm
            null, 			//Beschriftung x-Achse
            "m³/h",			//Beschriftung y-Achse
            dataset, 		//verwendeter Datensatz
            false, 			//Legende anzeigen
            true, 			//Tooltips
            false);			//URLs
        XYPlot plot = result.getXYPlot();
        ValueAxis axis = plot.getDomainAxis();
        axis.setAutoRange(true);			//Autoskalierung der y-Achse
        axis.setFixedAutoRange(60000);	//Skalierung x-Achse 
        axis = plot.getRangeAxis();
        return result;
    }

Und hier wird das Ergebnis der JComboBox ausgewertet:
Java:
public void setRange(double range){
    	this.r = range;
        //hier müsste die setFixedAutoRange aufgerufen werden???
    }
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Also wenn du in einer Methode ein Objekt manipulieren möchtest, welches du in einer anderen Methode erzeugt hast, musst du dieses Objekt "methodenübergreifend" zur Verfügung stellen, also als Instanz- oder Klassenvariable, oder zumindest einen methodenübergreifende Weg, auf das Objekt zuzugreifen.

Wenn sich die createChart() und die setRange() methode in derselben Klasse befinden, müsstest du den JFreeChart, den XYPlot oder direkt die ValueAxis als Instanzvariable deklarieren.

ich würde mir eine Klasse schreiben, die das ActionListener interface implementiert, und einer INstanz der Klasse eine Referenz auf die ValueAxis übergeben. Dann wird die ActionListener-Instanz als ActionListener bei der JComboBox registriert.
Dann musst du nur noch in der actionPerformed(ActionEvent) methode des listeners die source des ActionEvents (welches die JComboBox ist) zu einer JComboBox casten, den Wert mit JComboBox.getSelectedItem() beschaffen, daraus irgendwie eine Zahl machen und die als Argument an SetFixedAutoRange-Methode der ValueAxis, auf die die listenmer-Klasse ja zugreifen kann, übergeben.
 

RainerUnsinn

Mitglied
Tut mir leid. Ich stehe gerade irgendwie auf dem Schlauch. Also die createChart() und die setRange befinden sich in der selben Klasse. In einer weiteren Klasse wird die JComboBox implementiert. Hab das allerdings mit dem ItemListener gelöst.
Java:
class ComboRangeListener implements ItemListener{			
		public void itemStateChanged(ItemEvent e){
			JComboBox selectedChoice = (JComboBox) e.getSource();
			if("20 min".equals(selectedChoice.getSelectedItem())){
				_view.setRange(1200000);
			}
			else if("60 min".equals(selectedChoice.getSelectedItem())){
				_view.setRange(3600000);
			}
		}
}
Nur mir ist immer noch nicht ganz klar wo genau die setFixedAutoRange ins Spiel kommt:bahnhof: Bin noch nicht so erfahren in Java. Vielen Dank für deine Geduld mit mir:)
 

Harry Kane

Top Contributor
Offenbarf hast du eine Sammlung von Klassen, die irgendwie zusammenarbeiten müssen. Im Kern musst du zu der Lösung deines Problems nur dafür sorgen, daß ein objekt sowohl als Listener auf der JComboBox registriert wird, als auch Zugriff auf die ValueAxis bekommen kann, um den Wertebereich zu setzen.
Hier mal ein rudimentäres Beispiel:
Java:
public class SimpleXYPlot{
	public static void main(String[] args){
		DefaultXYDataset dataset = new DefaultXYDataset();
		dataset.addSeries("Red Circles And Lines",new double[][]{{1, 2, 3}, {2, 4, 1}});		
		ValueAxis xAxis = new NumberAxis("x axis");
		ValueAxis yAxis = new NumberAxis("y axis");
		XYItemRenderer renderer = new XYLineAndShapeRenderer();
		XYPlot plot = new XYPlot(dataset, xAxis, yAxis, renderer);
		JFreeChart chart = new JFreeChart(plot);
		JFrame frame = new JFrame();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(new ChartPanel(chart));
		JComboBox box = new JComboBox(new Integer[]{1,10,20});
		box.addActionListener(new AxisRangeController(xAxis));
        frame.getContentPane().add(box, BorderLayout.NORTH);
        frame.pack();
        frame.setVisible(true);
        
	}
    static class AxisRangeController implements ActionListener{
        private ValueAxis va;
        AxisRangeController(ValueAxis va){
            this.va = va;
        }   
        public void actionPerformed(ActionEvent ae){
            Object source = ae.getSource();
            if(!(source instanceof JComboBox)) return;
            Object value = ((JComboBox)source).getSelectedItem();
            if(!(value instanceof Number)) return;
            va.setFixedAutoRange(((Number)value).doubleValue());
        }
    }
}
Wie du dies am besten in deine schon vorhandenen Klassen integrierst, ist kaum zu sagen.
Was ist eigentlich das "_view" Object, auf das dein ComboRangeListener zugreift? Kannst du diesem object eine Referenz auf die ValueAxis übergeben?
 

RainerUnsinn

Mitglied
Vielen Dank Harry. Es funktioniert genauso wie ich mir das vorgestellt habe:toll: Der entscheidene Punkt war wie du gesagt hast die Anmeldung der ValueAxis am Listener.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
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
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
S JFreeChart neu zeichnen sich das Datenset geändert hat. AWT, Swing, JavaFX & SWT 4
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
T Swing DPI-Skalierung und Java 2D unter Java 11 (und Windows 10) AWT, Swing, JavaFX & SWT 2
S JavaFX Node soll auch nach Skalierung zentriert platziert sein AWT, Swing, JavaFX & SWT 3
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
Ernesto95 JavaFX Absolute Positionierung und Skalierung AWT, Swing, JavaFX & SWT 1
K Automatische Skalierung von GUI Elementen (Java Swing) AWT, Swing, JavaFX & SWT 2
Furtano AWT Skalierung mehrerer Bilder / Histogramme im Fenster AWT, Swing, JavaFX & SWT 4
E Drucken von JPanel mit richtiger Skalierung AWT, Swing, JavaFX & SWT 5
P Problem - Zeichenungsfehler nach Skalierung oder Transformation AWT, Swing, JavaFX & SWT 4
B Komponenten nach Skalierung nicht mehr ansprechbar AWT, Swing, JavaFX & SWT 9
Luk10 AWT Image und die Skalierung! AWT, Swing, JavaFX & SWT 3
S Bild-Skalierung AWT, Swing, JavaFX & SWT 3
O Skalierung des Center-Bereichs unterbinden AWT, Swing, JavaFX & SWT 2
C Bei Skalierung wird paintComponent() nicht aufgerufen,warum? AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben