Grafikbefehle Anwenden mit Tips und Trick
Zuerst werden wir mal die aktuelle Zeichenfarbe weiß setzen.
setColor(Color.white)
Wir haben einige vordefinierte Farben in der Color-Klasse die wir verwenden können.
| Name | Rot | Grün | Blau
|
|---|
| black | 0 | 0 | 0
|
| blue | 0 | 0 | 255
|
| cyan | 0 | 255 | 255
|
| darkGray | 64 | 64 | 64
|
| gray | 128 | 128 | 128
|
| green | 0 | 255 | 0
|
| lightgray | 192 | 192 | 192
|
| magenta | 255 | 0 | 255
|
| orange | 255 | 200 | 0
|
| pink | 255 | 175 | 175
|
| red | 255 | 0 | 0
|
| white | 255 | 255 | 255
|
| yellow | 255 | 255 | 0
|
Eine eigene Farbe können wir so erstellen.
farbe = new Color(r,g,b)
R,G,B bestimmt den Rot, Grün, Blau Anteil. Der Wertebreich ist 0-255.
import java.awt.*;
import java.applet.*;
public class farbe extends Applet
{
public int mx,my;
public void paint(Graphics g)
{
Color farbe;
g.setColor(Color.white);
g.drawString("Hallo Welt",10,10);
farbe = new Color(100,100,100);
g.setColor(farbe);
g.drawString("Hallo Welt",10,22);
}
}
Hier nun das Beispiel in Aktion:
Möchten wir die Hintergundfarbe ändern so müssen wir diesen
mit einer anderen Farbe ausfüllen bevor wir die Strings ausgeben.
fillRect(x,y,width,height);
Diese Methode füllt ein Rechteck an Postion x,y
mit der breite und höhe von width, height.
import java.awt.*;
import java.applet.*;
public class farbeb extends Applet
{
public int mx,my;
public void paint(Graphics g)
{
Color farbe;
g.setColor(Color.black);
g.fillRect(0,0,size().width,size().height);
g.setColor(Color.white);
g.drawString("Hallo Welt",10,10);
farbe = new Color(100,100,100);
g.setColor(farbe);
g.drawString("Hallo Welt",10,22);
}
}
Mit die Methode size().width und size().height
erfahren wir die Höhe und Breite des Applets.
Hier nun das Beispiel in Aktion:
Anhand von folgendem Applet werde wir ein das Flicker-Problem erkennen.
import java.awt.*;
import java.applet.*;
public class gmaus extends Applet
{
public int mx,my;
public boolean mouseMove(Event e,int x ,int y)
{
mx=x;
my=y;
repaint();
return true;
}
public void paint(Graphics g)
{
g.setColor(Color.black);
g.fillRect(0,0,size().width,size().height);
g.setColor(Color.white);
g.drawString("XPos:"+Integer.toString(mx),10,10);
g.drawString("YPos:"+Integer.toString(my),10,22);
}
}
Sobald wir die Maus innerhalb des Applets bewegen wird die Methode
repaint()
aufgerufen die wiederum die Methode update(Graphics g) ausführt die
den gesamten Appletbereich löscht und dann erst neuzeichnet.
Dadurch entsteht ein Flackern.
Verhindern kann man das indem wir die Methode update()
überschreiben.
public void update(Graphics g)
{
// Appletbereich nicht löschen direkt neuzeichnen
paint(g);
}
Das was jetzt noch flackert ist das Neuzeichnen des Strings.
Zuerst wird ja der Hintergund schwarz gelöscht und dann erst der String gesetzt.
Auch dies können wir mit einem Buffer unterdrücken.
Dafür müssen wir ersteinmal eine init()-Methode schreiben.
private Image Buffer;
private Graphics zBuffer;
public void init()
{
Buffer=createImage(size().width,size().height);
zBuffer=Buffer.getGraphics();
}
Dies Methode wird vom Browser aus als Initialisierung aufgerufen.
Wir könne hier Variablen setzen oder unser Buffer gestalten.
Mit createImage(size().width,size().height)
erstellen wir ein Image.
Mit zBuffer=Buffer.getGraphics() bekommen wir ein Graphics-Object zBuffer.
Damit können wir Grafik Befehle innerhalb des Images Buffer benutzen.
Hier das fertige Flickrfrei Applet
import java.awt.*;
import java.applet.*;
public class gmausc extends Applet
{
private int mx,my;
private Image Buffer;
private Graphics zBuffer;
public void init()
{
Buffer=createImage(size().width,size().height);
zBuffer=Buffer.getGraphics();
}
public void update(Graphics g)
{
paint(g);
}
public boolean mouseMove(Event e,int x ,int y)
{
mx=x;
my=y;
repaint();
return true;
}
public void paint(Graphics g)
{
Color farbe;
zBuffer.setColor(Color.black);
zBuffer.fillRect(0,0,size().width,size().height);
zBuffer.setColor(Color.white);
zBuffer.drawString("XPos:"+Integer.toString(mx),10,10);
zBuffer.drawString("YPos:"+Integer.toString(my),10,22);
g.drawImage(Buffer,0,0,this);
}
}
Mit der Graphics Methode drawImage(Image img,x,y,ImageObserver observer);
Wird der Buffer in die normale Grafik Oberfläche kopiert.
Daher werden die zeichnenvorgänge nicht mehr sichtbar und nur das resultat erscheint.
Ein Flickern ist somit ausgeschlossen.
Image img ist der Buffer.X,Y steht für die Position zudem kopiert werden soll.
ImageObserver observer definiert das Object das informiert werden soll. (Meistens this bei Applets.)
Es liefert true zurück sobald alle Pixel gezeichnet wurden.
Hier das fertige Flickerfrei-Beispiel in Aktion: