# paint methode richtig aufrufen



## Fridolin (30. Jun 2004)

Hallo,
ich wollte aus einer Textdatei eine Map zeichnen lassen mit einem InputStream und einem graphics objekt
allerdings das hab ich nicht geschafft, ich glaube es hat irgendwas mit den zyklen eines applets zu tun aber da ich mich nicht besser auskenne will ich nichts dazu sagen kann sich das vielleicht wer anschauen und mir helfen , wenn man das applet startet kommt auf jedenfall unten ein schriftzug mit applet notinited 

lg Fridolin

```
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;

public class VersuchPacman extends Applet implements Runnable
{
	private Graphics dbg;
	private URL url;
	InputStream stream;
	StreamTokenizer tokenizer;
	
public void init()
{
	
	try
		{
  			url = new URL(getCodeBase(), "Kopie von Mappe.txt");
		}
	catch (final MalformedURLException e)
		{

  		}
		
  
    
	try
		{
  			stream = url.openStream();
  			tokenizer = new StreamTokenizer(stream);
			tokenizer.parseNumbers();
			tokenizer.wordChars('c', 'c');
			tokenizer.wordChars('w', 'w');
			tokenizer.wordChars('n', 'n');
			tokenizer.wordChars('s', 's');
			tokenizer.wordChars('e', 'e');
			tokenizer.wordChars('0', ' ');
        	tokenizer.eolIsSignificant(true);
        	tokenizer.ordinaryChars(0, ' ');
        	tokenizer.slashSlashComments(true);
        	tokenizer.slashStarComments(true);
			tokenizer.whitespaceChars(' ',' ');
			
			String board[][] = new String[18][41]; 
			int boardint[][] = new int[18][41]; 
			int count1 = 0;
			int count2 = 0;
			int boardx = 0;
			int boardy = 0;
			String message = "";
			int blocksizex = 7; 
			int blocksizey = 16; 
			int token;

		while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF)
		{
  		switch (token)
  			{
    	    	case StreamTokenizer.TT_WORD:
      		message = "Word: " + tokenizer.sval;
      		board[count1][count2] = tokenizer.sval;
                                count2++;
      		break;
      	case StreamTokenizer.TT_EOL:
      		count1++;
            break;
        case StreamTokenizer.TT_EOF:
            break;
        default:
            char ch = (char)tokenizer.ttype;
            break;
  			}
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
			for(count2 = 0; count2 <= 39; count2++)
			{
			boardint[count1][count2] = Integer.parseInt(board[count1][count2]);
			}	
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
                                boardy+=blocksizey;
                                boardx = 0;
			for(count2 = 0; count2 <= 39; count2++)
			{
			switch (boardint[count1][count2])
				{
  			case 'n': dbg.setColor(Color.blue);
    			break;
  			default: dbg.setColor(Color.black);
    			break;
				}

		dbg.fillRect(boardx,boardy,blocksizex, blocksizey);
                                boardx+=blocksizex;

			}	
		}

	} 
catch (final IOException e) { }
}
	public void start ()
	{
		Thread th = new Thread (this);
		th.start ();
	}

	public void run ()
	{
	
	}
	public void paint (Graphics g)
	{
	
		paint(dbg);
	}


}
```


----------



## Beni (30. Jun 2004)

FAQ...

Um zu zeichnen musst du die paint-Methode _des Applets_ überschreiben. Das geht nur in der Klasse, die von Applet erbt.
Um neu zu zeichen musst du die _repaint_-Methode des Applets aufrufen. Das kannst du aus jedem Thread machen.


----------



## Fridolin (30. Jun 2004)

Wo steht das in der FAQ ich habs nicht gefunden


----------



## Beni (30. Jun 2004)

hier 

Aber das mit repaint steht (noch) nicht dort.

mfg Beni


----------



## Fridolin (1. Jul 2004)

Tut mir leid Beni ich habs nicht zusammengebracht, was ist daran falsch du hast gesagt ich muss die paint methode
des Applets überschreiben aber das kann ich nicht, wie muss man das machen 
Was heißt Applet notinited Ladevorgang läuft...?


```
<HTML>
<HEAD>

<TITLE> VersuchPacman </TITLE>

</HEAD>
<BODY BGCOLOR="#000000" TEXT="#DDEECC" LINK="#FF8899" VLINK="#9988FF" ALINK="#FFFFFF">

<LEFT>
<APPLET CODE="VersuchPacman.class" WIDTH = 294 HEIGHT = 304 VSPACE=100 HSPACE=100>
<PARAM NAME=font VALUE="TimesRoman">
<PARAM NAME=size VALUE="36">
</APPLET>




Click on applet to allow for keyboard input

</HTML>
```


----------



## L-ectron-X (3. Jul 2004)

Fridolin, der HTML-Code hat mit dem Überschreiben der paint()-Methode nichts zu tun.
Wenn man vom Überschreiben spricht, meint man damit, eine in einer Basisklasse bereits definierte Methode in einer Subklasse mit eigenen bzw. erweiterten Fähigkeiten zu programmieren.
Vererbung (OOP) darf in diesem Fall für Dich kein Fremdwort sein.

Um in Deinem Applet die paint()-Methode zu überschreiben muss sie erst mal eingeführt werden, wie Du es schon gemacht hast. Damit die paint()-Methode zeichnen kann, musst Du ihr das erwartete Graphics-Objekt übergeben.
Das Graphics-Objekt, welches Du mit einem Zeichenblatt vergleich kannst, kann vor der Ausgabe mit paint() beliebig gestaltet werden.

Wenn Du das Graphics-Objekt als Instanzvariable (global) deklariert hast, kannst Du von allen Methoden Deiner Applet-Klasse darauf zugreifen, es verändern oder auslesen.
Der Aufruf _paint(g)_ kann aus jeder Methode Deiner Applet-Klasse erfolgen. Ebenso die _repaint()_-Methode, die ein Neuzeichnen auslöst.

Den Inhalt der paint()-Methode beschränkst Du auf die Ausgabe vom dem, was gezeichnet werden soll.
Dazu benutzt Du die Methoden des übergebenen Graphics-Objekts.


----------



## Fridolin (3. Jul 2004)

Hallo L-ectron-X,
du hast mir im forum anfänger geschrieben das man nicht von applets auf dateien zugreifen kann,
und da ich sie nicht selbst signieren kann muss ich den teil 


```
try
		{
  			url = new URL(getCodeBase(), "Kopie von Mappe.txt");
		}
	catch (final MalformedURLException e)
		{

  		}
```

irgendwie umschreiben wenn ich eine Application daraus machen will da getCodeBase anscheinend 
eine methode der klasse applet ist Wie mach ich das mit meinem streamtokenizer  kann oder muss ich das mit einem BufferedReader oder StringBuffer tun und dann an meinen streamtokenizer weitergeben

was ist der unterschied zwischen den beiden varianten?

BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

FileInputStream is = new FileInputStream("Kopie von Mappe.txt");
Reader r = new BufferedReader(new InputStreamReader(is));
   StreamTokenizer st = new StreamTokenizer(r);

würde folgendes beispiel gehen, was ist der Unterschied zwischen einem BufferedReader und einem Reader?
BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));
StreamTokenizer st = new StreamTokenizer(in);

lg Fridolin


```
try
		{
  			stream = url.openStream();
  			tokenizer = new StreamTokenizer(stream);
			tokenizer.parseNumbers();
			tokenizer.wordChars('c', 'c');
			tokenizer.wordChars('w', 'w');
			tokenizer.wordChars('n', 'n');
			tokenizer.wordChars('s', 's');
			tokenizer.wordChars('e', 'e');
			//tokenizer.wordChars('0', ' ');
			tokenizer.ordinaryChars(0, ' ');
			tokenizer.whitespaceChars(' ',' ');
        	tokenizer.eolIsSignificant(true);
        	tokenizer.slashStarComments(true);
        	tokenizer.slashSlashComments(true);
        	
		while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF)
		{
  		switch (token)
  			{
    	case StreamTokenizer.TT_WORD:
      		message = "Word: " + tokenizer.sval;
      		board[count1][count2] = tokenizer.sval;
            count2++;
      		break;
      	case StreamTokenizer.TT_EOL:
      		count1++;
            break;
        case StreamTokenizer.TT_EOF:
        	count1 = 0;
        	count2 = 0;
            break;
        //default:
            //char ch = (char)tokenizer.ttype;
            //break;
  			}
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
			for(count2 = 0; count2 <= 40; count2++)
			{
			boardint[count1][count2] = Integer.parseInt(board[count1][count2]);
			}	
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
                           		if(count1 != 0)
                                {
                                boardy+=blocksizey;
                                boardx = 0;
                                }
			for(count2 = 0; count2 <= 40; count2++)
			{
			switch (boardint[count1][count2])
				{
  			case 'n': 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.blue);
    			break;
  			default: 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.black);
    			break;
				}
				
		dbg.drawRect(boardx,boardy,blocksizex,blocksizey);
		dbg.fillRect(boardx,boardy,blocksizex,blocksizey);
                                boardx+=blocksizex;
                                
			}	
		}
		paint(dbg);		
	}
```


----------



## Fridolin (3. Jul 2004)

Noch eine Frage hab ich wieso bekommt man bei folgendem einen stackoverflowerror es
sind doch gar nicht so viele zeichen drinnen nur 18*42 und 18 zeilenumbrüche


```
import java.awt.*;
import java.io.*;
import javax.swing.*;

public class VersuchPacman extends JFrame 
{
	private Graphics dbg;
	StreamTokenizer tokenizer;
	//BufferedReader in;
	FileInputStream is;
	Reader r;
	String board[][] = new String[18][42]; 
	String message = "";
	int boardint[][] = new int[18][42]; 
	int count1 = 0;
	int count2 = 0;
	int boardx = 0;
	int boardy = 0;
	int blocksizex = 7; 
	int blocksizey = 16; 
	int token;
	
public void VersuchPacman()
{
	

	try
		{
  			
  			//in = new BufferedReader(
			//new FileReader("Kopie von Mappe.txt")); 
			//tokenizer = new StreamTokenizer(in); 
			is = new FileInputStream("Kopie von Mappe.txt"); 
			r = new BufferedReader(
				new InputStreamReader(is)); 
			tokenizer = new StreamTokenizer(r); 
			tokenizer.parseNumbers();
			tokenizer.wordChars('c', 'c');
			tokenizer.wordChars('w', 'w');
			tokenizer.wordChars('n', 'n');
			tokenizer.wordChars('s', 's');
			tokenizer.wordChars('e', 'e');
			//tokenizer.wordChars('0', ' ');
			tokenizer.ordinaryChars(0, ' ');
			tokenizer.whitespaceChars(' ',' ');
        	tokenizer.eolIsSignificant(true);
        	tokenizer.slashStarComments(true);
        	tokenizer.slashSlashComments(true);
        	
		while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF)
		{
  		switch (token)
  			{
    	case StreamTokenizer.TT_WORD:
      		message = "Word: " + tokenizer.sval;
      		board[count1][count2] = tokenizer.sval;
            count2++;
      		break;
      	case StreamTokenizer.TT_EOL:
      		count1++;
            break;
        case StreamTokenizer.TT_EOF:
        	count1 = 0;
        	count2 = 0;
            break;
        //default:
            //char ch = (char)tokenizer.ttype;
            //break;
  			}
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
			for(count2 = 0; count2 <= 40; count2++)
			{
			boardint[count1][count2] = Integer.parseInt(board[count1][count2]);
			}	
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
                           		if(count1 != 0)
                                {
                                boardy+=blocksizey;
                                boardx = 0;
                                }
			for(count2 = 0; count2 <= 40; count2++)
			{
			switch (boardint[count1][count2])
				{
  			case 'n': 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.blue);
    			break;
  			default: 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.black);
    			break;
				}
				
		dbg.drawRect(boardx,boardy,blocksizex,blocksizey);
		dbg.fillRect(boardx,boardy,blocksizex,blocksizey);
                                boardx+=blocksizex;
                                
			}	
		}
		paint(dbg);		
	} 
catch (final IOException e) { }
}
	
	public void paint(Graphics g)
	{
	paint(g);
	}
	
	public static void main(String args[])
	{
	VersuchPacman neu = new VersuchPacman();
	neu.setSize(294,288);
	neu.setLocation(100,100);
	neu.setVisible(true);
	} 
}
```

das wär der Versuch mit dem Applet aber funktioniert auch nicht

```
import java.applet.*;
import java.awt.*;
import java.net.*;
import java.io.*;

public class VersuchPacman extends Applet implements Runnable
{
	private URL url;
	private Graphics dbg;
	private Thread update = null;
	InputStream stream;
	StreamTokenizer tokenizer;
	String board[][] = new String[18][42]; 
	String message = "";
	int boardint[][] = new int[18][42]; 
	int count1 = 0;
	int count2 = 0;
	int boardx = 0;
	int boardy = 0;
	int blocksizex = 7; 
	int blocksizey = 16; 
	int token;
	
public void init()
{
	
	try
		{
  			url = new URL(getCodeBase(), "Kopie von Mappe.txt");
		}
	catch (final MalformedURLException e)
		{

  		}
		
  
    
	try
		{
  			stream = url.openStream();
  			tokenizer = new StreamTokenizer(stream);
			tokenizer.parseNumbers();
			tokenizer.wordChars('c', 'c');
			tokenizer.wordChars('w', 'w');
			tokenizer.wordChars('n', 'n');
			tokenizer.wordChars('s', 's');
			tokenizer.wordChars('e', 'e');
			//tokenizer.wordChars('0', ' ');
			tokenizer.ordinaryChars(0, ' ');
			tokenizer.whitespaceChars(' ',' ');
        	tokenizer.eolIsSignificant(true);
        	tokenizer.slashStarComments(true);
        	tokenizer.slashSlashComments(true);
			
			

	} 
catch (final IOException e) { }
}
	public void start ()
	{
		if(update == null)
		{
		update = new Thread(this, "update");
		update.start();
		}
		//Thread th = new Thread (this);
		//th.start ();
	}

	public void run ()
	{
	Thread dieserThread = Thread.currentThread();
	Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
	
		while(update == dieserThread)
		{
		repaint();
		try
			{
			Thread.sleep(10000);
			}
			
		catch(InterruptedException event)
			{
			//System.err.println(event);
			}
		}
		
		Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
	}
	
	public void stop ()
	{
	update = null;
	}
	
	public void destroy ()
	{
	dbg.dispose();
	}
	
	public void paint (Graphics dbg)
	{
		try
			{
		while ((token = tokenizer.nextToken()) != StreamTokenizer.TT_EOF)
		{
  		switch (token)
  			{
    	case StreamTokenizer.TT_WORD:
      		message = "Word: " + tokenizer.sval;
      		board[count1][count2] = tokenizer.sval;
            count2++;
      		break;
      	case StreamTokenizer.TT_EOL:
      		count1++;
            break;
        case StreamTokenizer.TT_EOF:
        	count1 = 0;
        	count2 = 0;
            break;
        //default:
            //char ch = (char)tokenizer.ttype;
            //break;
  			}
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
			for(count2 = 0; count2 <= 40; count2++)
			{
			boardint[count1][count2] = Integer.parseInt(board[count1][count2]);
			}	
		}
		for(count1 = 0; count1 <= 16; count1++)
		{
                           		if(count1 != 0)
                                {
                                boardy+=blocksizey;
                                boardx = 0;
                                }
			for(count2 = 0; count2 <= 40; count2++)
			{
			switch (boardint[count1][count2])
				{
  			case 'n': 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.blue);
    			break;
  			default: 
  				if(dbg == null)
  				{
  				dbg = getGraphics();
  				}
  				dbg.setColor(Color.black);
    			break;
				}
				
		dbg.drawRect(boardx,boardy,blocksizex,blocksizey);
		dbg.fillRect(boardx,boardy,blocksizex,blocksizey);
                                boardx+=blocksizex;
                                
			}	
		}
		paint(dbg);
		}
		catch (final IOException e) { }
	}
	
	public void update (Graphics dbg)
	{
		paint(dbg);
	}
}
```


----------



## L-ectron-X (3. Jul 2004)

_Applet not inited_ bedeutet das das Applet nicht initialisiert werden konnte, also die init()-Methode auf Grund eines Fehlers nicht durchlaufen werden konnte.


			
				Fridolin hat gesagt.:
			
		

> du hast mir im forum anfänger geschrieben das man nicht von applets auf dateien zugreifen kann,
> und da ich sie nicht selbst signieren kann muss ich den teil


Diesen Beitrag habe ich schon gesucht, weil ich dazu noch eine Ergänzung für Dich schreiben wollte.
Man kann Applets grundsätzlich auch selbst signieren. Dazu habe ich mal folgende Webseite zur Information:
http://www.olison.com/sites/signatur.php

Reader ist die abstrakte Superklasse von allen Character-InputStream-Klassen, also von zeichenorientierten Stream-Klassen. Die Klasse BufferedReader ermöglicht ein effizienteres Einlesen von Daten.
Die Klasse FileInputStream gehört zu den byteorientierten Stream-Klassen und arbeitet direkt auf externen Datenquellen.

Zur richtigen Benutzung von Stream-Klassen kannst Du Dich hier belesen:
http://www.galileocomputing.de/openbook/javainsel3/


----------



## Fridolin (3. Jul 2004)

Nein mittlerweile kommt es nicht mehr aber da ist gestanden applet notinited
aber seitdem ich das einlesen mit streamtokenizer aus der init methode genommen 
und alles in die paint methode gegeben habe passt alles bis auf das nicht gezeichnet wird hmm
danke für den link
vielleicht liegts daran das ich die paint methode nirgends aufgerufen habe
das werd ich jetzt mal probieren


----------



## L-ectron-X (3. Jul 2004)

Probleme mit Jar bzw jar-Archiven

*Thema geteilt, da neuer Topic*
http://www.java-forum.org/de/viewtopic.php?t=6191

Bitte für ein neues Thema einen neuen Thread aufmachen.


----------

