# Java Applet - Font aus datei laden



## Developer_X (27. Aug 2009)

hi, wie ihr ja alle sicherlich wisst, kann man ja mit :

```
Font font = Font.createFont(Font.Font_Typ,File oder FileInputStream);
```
ein Font laden, genauer gesagt einen TrueTypeFont Datei, will ich verwenden.

Mein Problem :
das soll in einem Applet geschehen.

wie soll ich das bloß anstellen?

L-ectron-X lehrte mich einst, bei Applets, immer FileInputStreams zu verwenden, sei es beim laden von TextInhalten, aber nciht bei Bildern und Sounds, da gibt es ja schon Methoden, in der Klasse Applet.

Aufjedenfall, hatte er mir gesagt, wie wäre es, wenn ich es so versuchen würde:

[JAVA=33]
Font f = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("Font.ttf"));	
[/code]

Also meine Font Datei, die heißt Font.ttf(, und man kann sie auch bei Applikationen laden, aber anstatt des Inputstreams, einfach nur ein File, ) und befindet sich in meiner Jar, verpackt, ganz praktisch, kann aber darauf net zugegriffen werden

```
java.io.IOException: Problem reading font data.
	at java.awt.Font.createFont(Unknown Source)
	at JavaApplets.MainApplet.paint(MainApplet.java:33)
	at sun.awt.RepaintArea.paintComponent(Unknown Source)
	at sun.awt.RepaintArea.paint(Unknown Source)
	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
java.io.IOException: Problem reading font data.
	at java.awt.Font.createFont(Unknown Source)
	at JavaApplets.MainApplet.paint(MainApplet.java:33)
	at sun.awt.RepaintArea.paintComponent(Unknown Source)
	at sun.awt.RepaintArea.paint(Unknown Source)
	at sun.awt.windows.WComponentPeer.handleEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Hättet ihr ne Idee was ich machen könnte?
Den Font kann er lesen, ganz klar, wenns bei einer Applikation geht, gehts auch so, aber das finden, ich glabe das ist auch nicht der Punkt.

Er kann nicht die Font Datei lesen.
Er hat ein Problem dabei.

Aber was für eins?
Das beim finden?
Oder beim lesen der Datei?, aber warum beim Applet,`?

kann mir bitte jemand weiterhelfen, ich bedanke mich schon mal recht herrzlich, 
Developer_X


----------



## faetzminator (28. Aug 2009)

Wo liegt die Font im jar? Nebenbei erwähnt sollten Packages immer nur aus Kleinbuchstaben bestehen (z.B. "ch.faetzminator.ircwaynebot" für das Projekt IRCwayneBot)


----------



## Developer_X (28. Aug 2009)

ok, package, schreibe ich dann klein, ich weiß um ehrlich zu sein nciht genau wo die da drin ist, ich würde lieber meinem Applet sagen, es soll in dem Ordner nach dem Font suchen wo es selbst im Internet abgespeichert ist, ich habe die Font Datei dort nämlich

geht das?

PS:
Wenns nur in der Jar geht :
Ich benutzte dafür Eclipse, und habe jetzt einfach einen Rechtsklick auf mein Projekt gemacht und dann Paste, dann war die TrueTypeFont-Datei im verzeichnis, in dem Projekt.

Developer_X


----------



## faetzminator (28. Aug 2009)

Die hast du warscheinlich nicht beim Jar-Export mitgeliefert. Schau dir mal beim Erstellen des Jars alle inkludierten Dateien genau an (afaik Step 1 oder 2).


----------



## Developer_X (28. Aug 2009)

selbst wenn ich das ganze bei mir in Eclipse starte, also das Applet, da gibts ja diese Funktion, gehts nicht, warum?

ich mache das mit dem Font laden so:

```
//Font
		try
		{
			mainfont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("Font.ttf"));
			mainfont = mainfont.deriveFont(20f);
		}
		catch(Exception e)
		{
			e.printStackTrace();
			mainfont = new Font("Times New Roman",1,20);
		}
```


----------



## Developer_X (28. Aug 2009)

um jetzt nich noch einen Extra Thread aufzumachen, kann mir jemand bei einem weiterem Problem helfen, bitte?

Ich weiß nicht ob ihr GradientPaint kennt. Wenn nicht, lest euch das mal in der API durch, das kann man mit Graphics2D verwenden, um Farbübergänge zu schaffen.

Als Parameter, kann man die 2 Punkte vom starten der Farbübergänge, bis zum Ende der Farbübergänge weitergeben, ebenso die 2 Farben, zwischen denen der Farbübergang stattfinden soll.

Desweiteren, habe ich eine Klasse, also mein Applet geschrieben, bei dem ich die 2 Punkte gern stets in bewegung halten wollte, sodass es aussieht als ob sich die Lichtquelle ( weil ich Color.black und Color.white verwende ) vor dem Bildschirm bewegt.

Dies klappt aber leider nicht, weshalb?

```
package JavaApplets;

import java.applet.*;
import java.awt.*;

@SuppressWarnings("serial")
public class MainApplet extends Applet implements Runnable
{
	//Attributes
		//Applet Size
			Dimension d; 
		//MainFont
			Font mainfont;
		//floats
			float A_x;
			float A_y;
			float B_x;
			float B_y;
		//booleans
			boolean upA;
			boolean downA;
			boolean leftA;
			boolean rightA;
			
			boolean upB;
			boolean downB;
			boolean leftB;
			boolean rightB;
		//GradientPaint
			GradientPaint gp;
			
	public void delete()
	{	
	}
	public void init()
	{
		initAttributes();
	}
	public void start()
	{		
		//Start Thread
			Thread thread = new Thread(this);
			thread.start();
		
	}
	@Override
	public void paint(Graphics g)
	{
		g.setFont(mainfont);
		
		((Graphics2D) g).setPaint(gp);	
		g.fillRect(0,0,d.width,d.height);
		
		g.setColor(Color.red);
		g.drawString("Diese Seite ist in Arbeit", d.width/3 , d.height/3);
	}
	
	//implemented Methods
	public void run()
	{
		while(true)
		{
			moveLights();
						
			repaint();
			try
			{
				Thread.sleep(100);
			}
			catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	//unimplemented Methods
	public void initAttributes()
	{
	//Explain the Dimension
		d = this.getSize();
	//Font
		try
		{
			mainfont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("Font.ttf"));
			mainfont = mainfont.deriveFont(20f);
		}
		catch(Exception e)
		{
			mainfont = new Font("Times New Roman",1,20);
		}
	//floats
		A_x = d.width/2;
		A_y = 0;
		
		B_x = d.width/2;
		B_y = d.height;
	//boolean	
		upA = true;
		upB = false;
		
		downA = false;
		downB = true;
		
		leftA = true;
		leftB = false;
		
		rightA = false;
		rightB = true;
	//GradientPaint
		gp = new GradientPaint(A_x, A_y, Color.black, B_x, B_y, Color.white);
	}
	
	public void moveLights()
	{
		if(upA)
		{
			if(A_y<=d.height)
			{
				A_y+= 0.01f;
			}
			else
			{
				upA = false;
				downA = true;
			}
		}
		if(downA)
		{
			if(A_y>=0)
			{
				A_y-= 0.1f;
			}
			else
			{
				downA = false;
				upA = true;
			}
		}
		if(rightA)
		{
			if(A_x<=d.height)
			{
				A_x+= 0.01f;
			}
			else
			{
				rightA = false;
				leftA = true;
			}
		}
		if(leftA)
		{
			if(A_x<=d.height)
			{
				A_x-= 0.01f;
			}
			else
			{
				leftA = false;
				rightA = true;
			}
		}
		if(upB)
		{
			if(B_y<=d.height)
			{
				B_y+= 0.01f;
			}
			else
			{
				upB = false;
				downB = true;
			}
		}
		if(downB)
		{
			if(B_y>=0)
			{
				B_y-= 0.1f;
			}
			else
			{
				downB = false;
				upB = true;
			}
		}
		if(rightB)
		{
			if(B_x<=d.height)
			{
				B_x+= 0.01f;
			}
			else
			{
				rightB = false;
				leftB = true;
			}
		}
		if(leftB)
		{
			if(B_x<=d.height)
			{
				B_x-= 0.01f;
			}
			else
			{
				leftB = false;
				rightB = true;
			}
		}
		gp = new GradientPaint(A_x, A_y, Color.black, B_x, B_y, Color.white);
	}
}
```


----------



## faetzminator (28. Aug 2009)

Die Ordnerstruktur deines Projektes wär noch hilfreich, warscheinlich musst du die Datei mit "../fonts/Font.ttf" oä laden.


----------



## Developer_X (28. Aug 2009)

also sie sieht bei mir so aus :


----------



## faetzminator (28. Aug 2009)

na dann machs in Eclipse mal mit [c]"../Font.ttf"[/c], da ist doch [c].[/c] das (hier nicht sichtbare) bin/ Verzeichnis. Also zuerst mit einem [c]..[/c] ein Level zurück


----------



## Developer_X (28. Aug 2009)

dann passiert das hier :

```
java.io.IOException: Problem reading font data.
	at java.awt.Font.createFont(Unknown Source)
	at JavaApplets.MainApplet.initAttributes(MainApplet.java:84)
	at JavaApplets.MainApplet.init(MainApplet.java:37)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
```


----------



## faetzminator (28. Aug 2009)

Was steht auf Zeile 84?


----------



## Developer_X (28. Aug 2009)

ich habe zu meinem 2ten Problem schon eine Antwort gefunden, der balken bewegt sich, aber sehr, sehr langsam, deswegen habe ich die Sachen verschnellert, dass das ganze auch mit dem bloßen Auge zu sehen ist.

Ein problem habe ich da aber noch:
das ganze flimmert, wie kann ich das bild neuzeichnen, und zwar ohne flimmern?
Siehe Quelltext Oben


----------



## Developer_X (28. Aug 2009)

faetzminator hat gesagt.:


> Was steht auf Zeile 84?



das hier

```
mainfont = Font.createFont(Font.TRUETYPE_FONT, getClass().getResourceAsStream("Font.ttf"));
```

Siehe Quelltext oben


----------



## faetzminator (28. Aug 2009)

Da hast du den Pfad ersetzt? Also ich würds mit "/Font.ttf", "Font.ttf" und "../Font.ttf" versuchen...


----------



## Developer_X (28. Aug 2009)

faetzminator hat gesagt.:


> Da hast du den Pfad ersetzt? Also ich würds mit "/Font.ttf", "Font.ttf" und "../Font.ttf" versuchen...



alle 3 möglichkeiten habe ich schon einmal eingesetzt, leider ohne Erfolg, bitte schau dir den Quellcode richtig an, besonders die Methode "initAttributes()"
darin wird der Font nämlich geladen, sag mir, was würdest du nehmen, in einem Applet?, einen InputStream, oder einen File?


----------



## Developer_X (28. Aug 2009)

hey, ich habe mal zum spaß die neueste Jar, die leider nicht auf meinem PC funktioniert hat, mal im Internet abgespeichert, mit meinem neuen FTP Programm, und siehe da, es funktioniert!

Rayman-2-TGE


----------

