Java Applet und Multithreading

dadevelopa

Mitglied
Hallo zusammen,
ich habe folgendes Problem: Ich habe ein Applet auf welchem mit einem GridLayout 4 verschiedene Panels angezeigt werden.
In zwei dieser Panels soll nun jeweils ein anderer Graph gezeichnet werden. Die Arrays mit den Daten für den Graphen besitzen beide gleich viele Elemente.
Die beiden Graphen einfach so zu zeichnen stellt kein Problem dar. Ich möchte nun jedoch alle paar Milisekunden einen Punkt des Graphen zeichnen, sodas es aussieht, als würde sich der Graph über die Zeit aufbauen.

Wie schaffe ich es nun, die Panels unabhängig vom Rest des Applets zeichnen zu lassen. Wichtig wäre auch, dass man den Zeichenvorgang jederzeit unterbrechen und wieder fortsetzen könnte.
Gibt es da bereits irgendwelche approved practices? Wie bindet man Panels als Thread in ein Applet ein, sodass es unabhängig vom rest der Applikation gezeichnet wird?

Danke für eure Antworten.
 
Hi,
wenn du den Graph in ein Canvas zeichnest, dann gib doch einfach in der paint-Funktion an, dass erst nach jedem x.ten Mal ein NEUES Bild erzeugt wird.
Vorher gibst du einfach das alte zurück.
 
Danke erstmal für deine Antwort.
Ich habe jetzt mal noch was anderes Probiert. Ich habe eine neue Graphenklasse erstellt welche als Thread läuft und den Graphen zeichnen soll, leider blockiert auch hier das ganze Applet.
Das Graphics-Objekt übergebe ich aus dem JPanel auf welchem der Graph gezeichned werden soll. könnte das das Problem sein?

Hier der Code der Graph-Klasse:

Code:
public class Graph implements Runnable {
	
	private Graphics2D graphics;
	private ArrayList coordinatePoints;
	private GraphWrapper graphWrapper;
	
	public Graph(Graphics2D graphics, ArrayList coordinatePoints, GraphWrapper graphWrapper) {
		this.graphics = graphics;
		this.coordinatePoints = coordinatePoints;
		this.graphWrapper = graphWrapper;
	}
	
	public void run(){
		int length = coordinatePoints.size();

		CoordinatePoint firstPoint = (CoordinatePoint) coordinatePoints.get(0);
		CoordinatePoint lastPoint = (CoordinatePoint)  coordinatePoints.get(length-1);
		
		double temperatureDifference = lastPoint.getIndex()- firstPoint.getIndex();
		double steplengthXAxis = new Double(graphWrapper.getEndXAxisX()-graphWrapper.getStartXAxisX())/temperatureDifference;  //calculate length of X-Axis and divide it by temp.difference to receive length of one degree
		double entropyDifference = lastPoint.getValue() - firstPoint.getValue();
		double steplengthYAxis = new Double(graphWrapper.getEndYAxisY()-graphWrapper.getStartYAxisY())/entropyDifference;
		//check variables so that points with same value are not printed twice
		int previousX = 0;
		int previousY = 0;
		for(int i=0; i<length; i++){
			CoordinatePoint point = (CoordinatePoint) coordinatePoints.get(i);
			int x = new Double((point.getIndex()-graphWrapper.getModel().getStartTemperature())*steplengthXAxis).intValue(); //Always begin at 0 on x-Axis
			int y = new Double((point.getValue()-graphWrapper.getModel().getStartEntropy())*steplengthYAxis).intValue();
			if(previousX != x || previousY != y){
				graphics.drawLine(graphWrapper.getStartXAxisX() + previousX, (graphWrapper.getSizeY()-graphWrapper.getStartYAxisY())-previousY, graphWrapper.getStartXAxisX() + x, (graphWrapper.getSizeY()-graphWrapper.getStartYAxisY())-y);
				previousX = x;
				previousY = y;
				try {
					Thread.sleep(30);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

}
 
hi,
ich bin zwar weniger Applet-Spezie als Application-Spezie, aber kann es damit zusammenhängen, dass Du Dein Runnable vielleicht nicht im richtigen Thread verarbeitet wird?
Wie hast Du denn Dein Runnable gestartet?

Takidoso
 
Java:
int i=0;
public void paint(Graphics g)
{
	if(i%200)
		//male was neues
         else
               //male das alte
         i++;
}
Das müsste gehen um eine Verögerung zu erreichen, ohne das Applet oder das Fenster einzufrieren.
 

Neue Beiträge

Zurück