Applet und Graphics

hury

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Applet:

Code:
public void init() {
			back = getImage(getCodeBase(), "feld.jpg");
			this.setSize(350, 800);			
			this.addMouseListener(this);
		}
		
		public void paint(Graphics g) {
			g.drawImage(back, 0,0, this);
			super.paint(g);
		}

Jetzt brauche ich eine weitere Methode wie zb
Code:
		public void schreibe(Graphics g) {
			g.setColor(Color.white);
			g.drawString("1", logik.get_kastenMitteHorizontal(0), logik.get_kastenMitteVertikal(1));
		}

Diese lässt sich aber nur aus der init() aufrufen, weil sonst logischerweise das Graphics g unbekannt ist. Wie kann man das lösen, so dass ich weitere Methoden mit dem Graphics g aufrufen kann?

Gruß
Alex
 
Hallo,

auch der init()-Methode ist Graphics g unbekannt.

Der paint()-Methode wird Graphics g als Parameter übergeben.
Die reiht sie sich damit in ein System aus gegensetigen Aufrufen aus Methoden wie
update(Graphics g), paintAll(Graphics g) und paintComponent(Graphics g) etc. ein.

Allen gemein ist dass die Kette der Aufrufe durch die repaint()-Methode angestoßen wird.

Man sollte es tunlichst Vermeiden über das Graphics g-Objekt ausserhalb dieser Methoden
auf den Bildschirm zuzugreifen.

Ein Ausweg daraus ist die Verwendung von OffScreen-Images auf dessen Graphics-Objekt man
nach belieben zugreifen kann, um dann letztlich in einer der oben genannten Methoden dieses Image
auf den Bildschirm zu bringen !

Es ist natürlich möglich, selbst Methoden mit dem Parameter Graphics g zu erstellen,
diese Methoden sollten dann aber nur aus einer der oben genannten aufgerufen werden.

Code:
public void paint(Graphics g) {

    super.paint(g);
    meineMethode(g);
}

public void meineMethode(Graphics g) {

    g.draw ... // tu was Sinnvolles !

}

Gruß JAdix
 
Hallo,

könntest Du mir ein Beispiel für die Verwendung von OffScreen-Images geben?

Grüße
Alex
 
Hab´s , danke:

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class test {

public static void main(String[] args) throws IOException
{
BufferedImage bi = ImageIO.read(new File("feld.jpg"));
Graphics2D g2 = bi.createGraphics();
g2.setPaint(Color.red);


JLabel label = new JLabel(new ImageIcon(bi));
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(label, "West");
f.pack();
f.setVisible(true);
}
 
Hallo,

das Zeichnen klappt jetzt, jedoch tritt in unregelmäßigen Abständen ein anderes Phäneomen auf:

das Feld leer bleibt - dh. nur die hintergrund .jpg geladen wird, jedoch nicht die Strings ins Feld geschrieben werden.

Woran kann das liegen?

Code:
public class zahlen_GUI extends JFrame implements MouseListener {

//	private Point mousePos;
	Dimension prefSize;
	private static BufferedImage image;
	static JLabel label;
	static Graphics2D g2;
		
		zahlen_GUI() throws IOException {
			BufferedImage bi = ImageIO.read(new File("feld.jpg"));
			g2 = bi.createGraphics();
	    	g2.setPaint(Color.red);
	    		    	
	    	label = new JLabel(new ImageIcon(bi));
	    	JFrame f = new JFrame();
	    	
	    	f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	    	f.getContentPane().add(label, "West");
  
	    	f.pack();
	    	f.setVisible(true);
	    	
	    	

		}

	public static void drawInit(Graphics2D g, int feldBreite,int startReihen){
			for(int i=0; i<=feldBreite; i++) {
				for (int i2=0; i2<= startReihen; i2++) {
					drawBoxContents(g, i, i2);
				}
			}
		}
		
		public static void drawBoxContents(Graphics2D g, int x, int y) {
			g.drawString(logik.getBox(x, y), logik.get_kastenMitteHorizontal(x), logik.get_kastenMitteVertikal(y));
		}

		public static void main(String[] args) throws IOException {
			zahlen_GUI GUI = new zahlen_GUI();
	    	label.addMouseListener(GUI);
	    	
	    	feldoperationen.initFeld();
	    	drawInit(g2, 8, 2);
		}
 
Hallo,

so wie ich das sehe zeichnet das Fenstersystem dein ImageIcon-Label (bei dem ich mich
immernoch frage warum du es ausgerechnet so löst) auf den Bildschirm, noch bevor die
restlichen Bildbearbeitungsschritte (drawString) abgeschlossen sind.

Erzwinge doch mal einen repaint, wenn das Zeichnen unvollständig war, in dem du das
Fenster einmal minimierst und dann wieder maximierst, sind danach die Strings auf dem
Hintergrund gezeichnet ?
Wenn ja pack mal ein repaint() hinter das drawInit(. . .).

Gruß JAdix
 
Hi Jadix,

wenn ich das Fenster minimiere und wieder vergrößere, ist der Inhalt da.
Ein repaint() bringt leider nichts.

Was nu?

Gruß
Alex
 
Zurück