JPanel

crazy_chicken

Erfahrenes Mitglied
Hallo Zusammen,

ich möchte ein JPanel als ein Koordinatensystem nutzen. Die x-Achse wäre die Zeit, und dementsprechend die Y-Achse zu der jeweiligen Zeit gemessenen Werte.

Wie kann ich es realisieren, dass nach einer Zeit, wenn die x-Achse zu ende ist (auf dem JPanel die Breite), dass der Inhalt nach links verschoben wird, damit man die neuen werte sieht.

Beispiel:

Breite von dem Panel ist 400Px, das würde bedeuten 400 Sekunden.
Nach dem die 401,402,.... Sekunde ist, will ich den Inhalt nach rechts verschiebe.

Wie mache ich dass auch am ende kein Überlauf stattfindet?


Danke im Voraus!
 
Hi,

wie schauen deine internen Datenstrukturen aus? Wie speicherst du deine Punkte?

Folgende Variablen bräuchtest du zum X-Scrollen:
  • start
  • maxWidth (=Panelbreite)

Du zeichnest wahrscheinlich in der Paint()-Methode deine Punkte momentan aufs Panel. Nun musst du einfach nur die Punkte zum Zeichnen rausfiltern, dessen X-Werte mindestens start und maximal start + maxWidth betragen.
 
Ich benutze eigentlich gar keine Datenstruktur, da ich diese Punkte sonst für gar nichts brauche.
Ich verbinde nur die letzten Punkte miteinander mit drawLine(). Das ist dann ein Graph.

Gibt es keine möglichkeit den Inhalt einfach zu verschieben?

Deinen Lösungsansatz habe ich nicht ganz nachvollziehen können leider.


Danke!
 
Hi,

du könntest doch z.B. ein Point[] mit einer Größe von 400(wegen 400px Breite) erzeugen und jedem Point erstmal die Werte 0,0 geben. Dann zählst du vor jedem Aufruf deiner paint()-Methode dieses Array durch und verschiebst/aktualisierst die Werte für den Point.
 
Hi,

ich habe mal ein kleines Beispiel geschrieben um zu verdeutlichen wie ich das meine:
(ich habe das Point[] im Beispiel durch ein int[] ersetzt da ich einen festen x Wert verwende :))

Code:
import java.awt.Graphics;
import java.util.Random;

import javax.swing.JFrame;


@SuppressWarnings("serial")
public class TestClass extends JFrame
{
	private int[] y;
	private Random r;
	
	public TestClass()
	{
		this.setSize(400,400);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		this.y = new int[400];
		this.r = new Random();
	}
	
	public void newRandom()
	{
		y[399] = r.nextInt(200)+50;
		
		for(int i = 0; i < 399; i++)
		{
			int temp = y[i];
			y[i] = y[i+1];
			y[i+1] = temp;
		}
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
		for(int i = 399; i > 0; i--)
		{
			g.drawLine(i, y[i], i-1, y[i-1]);
		}
	}
	
	public static void main(String[] args)
	{
		TestClass c = new TestClass();
		c.setVisible(true);
		while(true)
		{
			c.newRandom();
			c.repaint();
			try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); }
		}
	}
}
 
Zurück