BufferStrategy im Applet

Stefan774

Grünschnabel
Hallo zusammen ich habe Probleme bei einem Applet ich hab mal eine Applikation geschrieben die mit Swing arbeitet und BufferStrategy einsetzt damit die Bewegungen nicht mehr flimmern, hat alles gut geklappt soweit. Aber jetzt wollt ich das selbe Prinzip auf einem Applet durchziehen und es will einfach nicht funktionieren ich bin ratlos. Ich hab schon einbischen gegoogelt aber nichts wirklich brauchbares gefunden. Das einzige was ich schon weiß ist dass man die BufferStrategy mit einem Canvas verschrauben muss und das Canvas dann dem Applet adden. Hab ich auch gemacht ich kann den Canvas (grau) sehen aber es wird einfach nichts gezeichnet. Wäre super wenn mir jemand eine Tipp geben könnte wich ich das doch noch schaffe.Ich weiß es gibt andere Möglichkeiten den Double Buffer zu realisieren aber ich fand das mit der Bufferstrategy eigentlich sehr confortabel.

Hier mein Ansatz:

PHP:
import java.applet.Applet;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.*;


public class BufferStrategyTest extends Applet implements Runnable {
	
	Canvas can = new Canvas();
	final int width = 500;
	final int height = 500;
	int x = 0;
	
	BufferStrategy strategy;
	
	final Dimension d = new Dimension(width,height);
	
	public void init(){
		this.setSize(d);
	}
	
	public void start(){
		if (strategy == null){
			
			this.setIgnoreRepaint(true);
			this.setLayout(null);
			
			can.setBackground(Color.gray);
			can.setIgnoreRepaint(true);
			can.setBounds(5, 5, 200, 200);
			can.requestFocus();
			
			this.add(can);
		}
		
		Thread go = new Thread(this);
		go.start();
		
		
	}
	
	public void stop(){
		
	}
	
	public void destroy(){
		
	}
	
	public void creatStrategy(){
		can.createBufferStrategy(1);
		strategy = can.getBufferStrategy();
	}

	@Override
	public void run() {
		
		creatStrategy();
		while (true){
			paintWorld();
			x++;
			try {
				Thread.sleep(50);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	
	}
	
	public void paintWorld(){
		
		Graphics g = can.getGraphics();
		g.setColor(Color.red);
		g.drawRect(x, 10, 50, 50);
		g.drawString("Hallo Applet", 20, 15);
		can.paint(g);
		
		strategy.show();
	}
	

}
 
Hallo,

wer nutzt denn noch die alte staubige Canvas-Klasse ? :)
Seit Java Version 1.weiß-nicht-genau sind doch die funktionalitäten direkt
in einer Component anwendbar ?

Das überschreiben der update() und paint() Methoden mit anschließendem
aufruf der repaint()-Methode über den Thread kommt für dich nicht in Frage ?

Gruß JAdix
 
Ja könnte ich aber da wäre doch dann das Problem dass ich dann wieder den "klassischen" Weg gehe mit offscreen Imag oder?

Und wenn man mal 2 Zeichenbereiche haben möchte kommt man doch um eine Canvas nicht rum.

Mich würd einfach mal interessieren warum mein Code nicht funktioniert und ob bzw. wie man die BufferStrategy in einem Applet verwenden kann.
 
Hi,

hast Du schon einen Versuch unternommen statt auf das
AWT.Applet auf swing.JApplet aufzusetzen

Wenn es in deiner Swing-Version funktioniert . . .

ist nur so ne Überlegung !

Gruß JAdix
 
Hey also erstmal danke für deine Ideen! Ich habs auch gleich mal ausprobiert (Ich hatte gar keine Ahnung dass es überhaupt ein JApplet gibt:rolleyes:). Hat aber leider nicht funktioniert. Das prog das ich mal geschrieben hab mit Swing war halt kein Applet naja.

Aber jetzt kommts ich hab eigentlich nichts geändert am Code nja für meinen Canvas eine eigene Klasse gemacht aber das hat ich zuvor auch schon. Aber siehe da es klappt aber ich hab noch irgend eine unschöne nullPointerException und weiß leider noch nicht woran es liegt.

Also hier mal die Exception:

Exception in thread "Thread-3" java.lang.NullPointerException
at sun.java2d.SunGraphics2D.validateColor(Unknown Source)
at sun.java2d.SunGraphics2D.<init>(Unknown Source)
at sun.awt.image.SunVolatileImage.createGraphics(Unknown Source)
at java.awt.image.VolatileImage.getGraphics(Unknown Source)
at java.awt.Component$BltBufferStrategy.getDrawGraphics(Unknown Source)
at BufferStrategyTest.paintWorld(BufferStrategyTest.java:79)
at BufferStrategyTest.run(BufferStrategyTest.java:66)
at java.lang.Thread.run(Unknown Source)

Und hier der Code:


PHP:
import java.applet.Applet;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.image.*;

import javax.swing.JApplet;


public class BufferStrategyTest extends Applet implements Runnable {
	
	MyCanvas can;
	Panel pan;
	final int width = 500;
	final int height = 500;
	int x = 0;
	
	public BufferStrategy strategy;
	
	final Dimension d = new Dimension(width,height);
	
	public void init(){
		this.setSize(d);
	}
	
	public void start(){
		if (strategy == null){
			
			can = new MyCanvas();
			
			this.setLayout(null);
			this.setIgnoreRepaint(true);
			
			can.setBackground(Color.gray);
			can.setBounds(5, 5, 200, 200);
			can.setIgnoreRepaint(true);
			can.requestFocus();
			
			this.add(can);
			Thread th = new Thread(this);
			th.start();
		}
		
		
	}
	
	public void stop(){
		
	}
	
	public void destroy(){
		
	}
	
	public void creatStrategy(){
		can.createBufferStrategy(2);
		strategy = can.getBufferStrategy();
	}

	@Override
	public void run() {
		creatStrategy();
		while (true){
			paintWorld();
			x++;
			try {
				Thread.sleep(20);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	
	}
	
	public void paintWorld(){
		
		Graphics g = strategy.getDrawGraphics();
		g.clearRect(0, 0, this.getWidth(),this.getHeight());
		g.setColor(Color.blue);
		g.fill3DRect(x, 5, 50, 50, false);
		g.drawString("Hallo Applet", 20, 15);
		can.paint(g);
		
		strategy.show();
	}
	
	class MyCanvas extends Canvas{
		public MyCanvas(){
			super();
		}
		public void paint(Graphics g){
			
		}
	}
	

}

Vielleicht jemand noch eine Idee?
 
Ok hat sich erledigt war nur weil ich meine Thread nicht im destroy() oder stop() beendet habe und dann läuft es auf eine nullPointer Exception raus.:)

Eine Frage hätt ich aber noch warum muss man bei BufferStrategy eine paint() Methode deffinieren wenn die Canvas Klasse schon eine mitbringt? Also ich versteh das mit .getDrawGraphics nicht ganz. Wann und wo zeichne ich denn in den Buffer? Ich rufe doch erst getDrawGraphics() auf bevor ich überhaupt was zeichne. Logisch wäre doch wenn der Aufruf nach dem Zeichen geschieht.
 
Zuletzt bearbeitet:
Zurück