Globale Variable (Font)

Status
Nicht offen für weitere Antworten.

Turkey1976

Mitglied
Ich möchte in meiner Main ein Font laden. Darauf möchte ich von allen anderen Objekten zugreifen können. Also im Sinne einer globalen Variablen oder Konstanten.

Wie mache ich das?

Gruß

Heiko

Jaja, ich weiß, dies widerspricht den Idealen der objektorientierten Programmierung....
 
G

Gast

Gast
getter und setter Methoden einbauen? Dann gibts auch kein Problem mit der Objektorientierung.
 

Turkey1976

Mitglied
Die Objekte, die das Font benötigen, werden nicht direkt von der Main erzeugt. Wie kann ich das Main-Objekt erreichen?
 

Joker

Bekanntes Mitglied
Codebeispiel? Wenn das Font der Main bekannt ist kannst du es mit einer getter Methode auch für andere Klassen abrufbar machen.
 

Turkey1976

Mitglied
Ein Codebeispiel ist zu aufwendig... ich ergänze ein altes Projekt.

wie ist der Aufruf aus einem beliebigen Objekt? Wie heißt meine Main? :)
 

Pappenheimer++

Bekanntes Mitglied
Du meinst, du willst den Klassen, die den Font brauchen, nicht immer Referenzen (zur Main) mitgeben? Hast du darüber nachgedacht, den Font einfach static zu machen? (Wahrscheinlich werden hier jetzt Kommentare folgen, die das als Misshandlung objektorientierter Programmierung geißeln werden, aber hey; übertreibt nicht ;) )
 

Turkey1976

Mitglied
Ja, genau! In verschiedenen Klassen steht bei mir Folgendes:


Code:
Font font;
ClassLoader cl =ClassLoader.getSystemClassLoader();     
InputStream in = this.getClass().getResourceAsStream("font.TTF");      	  	
try {font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);}catch(Exception e){ font = null;}
font=font.deriveFont(Font.PLAIN,size);
g.setFont(font);


Und wenn ich mehrere Objekte aus diesen Klassen erzeuge, wird bei einem vollständigen RePaint das Applet sehr sehr langsam. Verständlicherweise, da ja das Font immer wieder neu geladen wird!

Wenn ich jetzt aber in die Main folgenden Code eingebe:


Code:
    public static Font myfont() {
		Font font;
		ClassLoader cl =ClassLoader.getSystemClassLoader();     
		InputStream in = this.getClass().getResourceAsStream("font.TTF");      	  	
		try {font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);}catch(Exception e){ font = null;}
		font=font.deriveFont(Font.PLAIN,10);
		return font;	  
    }

erhalte ich beim Compilieren folgende Fehlermeldung:


compile:
[javac] Compiling 1 source file to /Applications/xampp/xamppfiles/htdocs/wb_e7/build
[javac] /Applications/xampp/xamppfiles/htdocs/wb_e7/source/Main.java:12: non-static variable this cannot be referenced from a static context
[javac] InputStream in = this.getClass().getResourceAsStream("font.TTF");
[javac] ^
[javac] Note: /Applications/xampp/xamppfiles/htdocs/wb_e7/source/Main.java uses or overrides a deprecated API.
[javac] Note: Recompile with -Xlint:deprecation for details.
[javac] 1 error

BUILD FAILED

Wie kann ich das Problem umschiffen? Das "font.TTF" liegt im JAR.


Gruß Heiko
 
G

Guest

Gast
Ich habe noch ein wenig rumprobiert, komme aber einfach nicht weiter! Wer kann mir helfen?

Heiko
 

Janus

Bekanntes Mitglied
Code:
public static Font myfont() { 
      Font font; 
      ClassLoader cl =ClassLoader.getSystemClassLoader();      
      InputStream in = cl.getResourceAsStream("font.TTF");               
      try {font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);}catch(Exception e){ font = null;} 
      font=font.deriveFont(Font.PLAIN,10); 
      return font;     
    }

musst nur dran denken, die font auch wirklich nur einmal zu laden. also nicht einfach nur in eine statische methode auslagern, sondern auch noch in einer statischen variable speichern und wirklich nur einmal laden.
 

Niki

Top Contributor
Du kannst es auch so machen:
Code:
public class FontHolder{

  private static Font font = null;

  static{
      Font font;
      ClassLoader cl =ClassLoader.getSystemClassLoader();     
      InputStream in = cl.getResourceAsStream("font.TTF");               
      try {
        font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);
        font=font.deriveFont(Font.PLAIN,10);
      }catch(Exception e){
        font = null;
      }
  }

  public static Font getFont(){
    return font;
  }

}

Hier wird der Font beim Laden der Klasse erzeugt und du brauchst dich um nichts mehr kümmern.
 

Turkey1976

Mitglied
Habe ich das jetzt richtig verstanden: Das Font wird beim erstmaligen Laden der Klasse geladen und nicht bei jedesmal wenn ich ein Objekt daraus erzeuge?
 

Marco13

Top Contributor
Ja. Trotzdem (!) sollte man die FontHolder-Klasse ergänzen um einen privaten Konstruktor
Code:
public class FontHolder
{
   /* private constructor to avoid instantiation */
   private FontHolder() {}

   private static Font font = null; 
   static{
      Font font; 
      ...
}
damit niemand auf die Idee kommt, sich Objekte einer Klasse zu erzeugen, von der es eigentlich keine Objekte geben muss (und darum auch nicht geben sollte oder darf)
 

Niki

Top Contributor
Kurz zur Erklärung:
Code:
static{

}

ist ein statischer Initialisierungsblock, der eben nur einmalig beim erstmaligen Laden der Klasse aufgerufen wird.
Es gibt auch normale Initialisierungsblöcke:
Code:
public class Initializer{

  //init
  {
    System.out.println("init");
  }

  public Initializer(){
    super();
    System.out.println("Konstruktor");
  }
}

Bei diesem Beispiel wird jedes mal beim Erzeugen eines neuen Objektes der Block ausgeführt, und zwar gleich nach dem super Aufruf des Konstruktors (oder this).
Also würde
Code:
 new Initializer();
diese Ausgabe produzieren:
Code:
init
Konstruktor

statische Initialisierungsblöcke werden sehr gerne beim Einbinden von C-Bibliotheken verwendet:
Code:
static{
  System.load("lib_name");
}
 

Turkey1976

Mitglied
Also ich habe jetzt die Klasse:


Code:
import java.io.*;
import java.awt.font.*;
import java.awt.*;

public class FontHolder{ 

 private FontHolder() {} 

 private static Font font = null; 
  
  

  static{ 
      Font font;
      ClassLoader cl =ClassLoader.getSystemClassLoader();      
      InputStream in = cl.getResourceAsStream("font.TTF");                
      try { 
        font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in); 
        font=font.deriveFont(Font.PLAIN,10); 
      }catch(Exception e){ 
        font = null; 
      } 
  } 

  public static Font getFont(){ 
     return font;
  
  } 

}


Wenn ich aus anderen Klassen den Aufruf


Code:
	FontHolder fh = new FontHolder();
	Font font = fh.getFont();

mache, erhalte ich lediglich das NULL Objekt zurück :-(



---------------


Die Ergänzung der FontHolder Klasse um


Code:
 private FontHolder() {}
bringt mir beim Compilieren folgenden Fehlercode:


[javac] /Applications/xampp/xamppfiles/htdocs/wb_e7/source/TextTool.java:110: FontHolder() has private access in FontHolder
[javac] FontHolder fh = new FontHolder();
 

Niki

Top Contributor
Code:
new FontHolder();
ist auch falsch, du musst so den Font holen:
Code:
FontHolder.getFont();
da getFont ja statisch ist.

gib mal im catch-Block den Stacktrace der Exception aus:
Code:
  static{     
      ClassLoader cl =ClassLoader.getSystemClassLoader();     
      InputStream in = cl.getResourceAsStream("font.TTF");               
      try {
        font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);
        font=font.deriveFont(Font.PLAIN,10);
      }catch(Exception e){
        e.printStackTrace();
        font = null;
      }
  }

//Edit, du musst natürlich Font font; weg lassen! (im initializer-Block)
 

Turkey1976

Mitglied
Das gibt mir die JAVA Console aus:

java.io.IOException: Stream closed
at java.io.BufferedInputStream.getInIfOpen(BufferedInputStream.java:134)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:254)
at java.io.BufferedInputStream.read(BufferedInputStream.java:313)
at java.awt.Font$1.run(Font.java:746)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Font.createFont(Font.java:732)
at FontHolder.<clinit>(FontHolder.java:18)
 

Turkey1976

Mitglied
Ich darf noch hinzufügen, dass das Laden des Fonts innerhalb der Objekte, in denen die Schrift benötigt wird, auch problemlos funktionierte.


Meine Klasse sieht im Moment so aus:


Code:
import java.io.*;
import java.awt.font.*;
import java.awt.*;

public class FontHolder{ 

 private FontHolder() {} 

 private static Font font = null; 
  
  

  static{ 
    //  Font font;
      ClassLoader cl =ClassLoader.getSystemClassLoader();      
      InputStream in = cl.getResourceAsStream("font.TTF");                
      try { 
        font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in); 
        font=font.deriveFont(Font.PLAIN,10); 
      }catch(Exception e){ 
       
       e.printStackTrace();
       font = null; 
      } 
      if (font==null) {System.out.println("Font wurde NICHT geladen");}
  } 
  public static Font getFont(){ 
     return font;
  } 
}

In der 6letzen Zeile Frage ich ab, ob font==null ist. Und genau diesen Output erhalte ich in der Javakonsole.
 
G

Gast

Gast
auf statische methoden greift man anders zu.

Code:
FontHolder.getFont();

könnte nicht schaden, mal ein buch für java anfänger zu lesen.
 

Turkey1976

Mitglied
könnte nicht schaden, mal ein buch für java anfänger zu lesen.

Lesen schadet selten. :meld:


Was ich als Ungebildeter nicht versehe, wie schaffe ich es denn das Font aus FontHolder in meine Klasse einzubinden?

Code:
FontHolder.getFont();

und dann?

ich hätte jetzt erwartet:

Code:
Font myFont = FontHolder.getFont();
g.setFont(myFont);

aber das funktioniert halt nicht...
 

Marco13

Top Contributor
Hm. Der Aufruf ist schon richtig. Wo genau die IOException herkommt ... ???:L hm.

Wenn du 100% (nicht 99.9% sondern 100%) sicher bist, dass er die "font.TTF" auch wirklich findet, könnte ich mir höchstens vorstellen, dass er bei der statischen Initialisierung irgendwie mit dem ClassLoader durcheinanderkommt. Du könntest die Klasse ggf. auch mal schreiben als
Code:
import java.io.*;
import java.awt.font.*;
import java.awt.*;

public class FontHolder{

private FontHolder() {}

   private static Font font = null;
 
  public static Font getFont()
  {
    if (font == null)
    {
      //  Font font;
      ClassLoader cl =ClassLoader.getSystemClassLoader();     
      InputStream in = cl.getResourceAsStream("font.TTF");               
      try {
        font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);
        font=font.deriveFont(Font.PLAIN,10);
      }catch(Exception e){
       
       e.printStackTrace();
       font = null;
      }
      if (font==null) {System.out.println("Font wurde NICHT geladen");}
    }

     return font;
  }
}

Aber das ist nur ins blaue geraten :? vielleicht hat jemand noch eine bessere Idee...
 
G

Guest

Gast
forulieren wir es mal so:

als sich der Code zum Laden des Fonts noch in der eigentlichen Klasse befand, funktionierte alles gut - bis auf dass bei 100 Instanzen das Applet äußerst zäh war :)

Also der folgende Code funktionierte definitiv:


Code:
Font font;
ClassLoader cl =ClassLoader.getSystemClassLoader();     
InputStream in = this.getClass().getResourceAsStream("font.TTF");      
try {font = Font.createFont(java.awt.Font.TRUETYPE_FONT, in);}catch(Exception e){ font = null;}
font=font.deriveFont(Font.PLAIN,size);
g.setFont(font);
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Globale Variable mehrmals verwenden Java Basics - Anfänger-Themen 7
Traxter Globale Variable ? Java Basics - Anfänger-Themen 11
Jackii Globale Variable aus anderer Klasse ändern... Java Basics - Anfänger-Themen 4
M Variablen Globale Variable? Java Basics - Anfänger-Themen 4
C lokale Variable verwenden statt globale Java Basics - Anfänger-Themen 7
S globale Variable deklarieren Java Basics - Anfänger-Themen 10
E Globale int Variable? Java Basics - Anfänger-Themen 6
K Datentypen Globale Variable direkt initialisieren oder im Konstruktor? Java Basics - Anfänger-Themen 13
T Globale Variable wird nicht gefunden Java Basics - Anfänger-Themen 6
A Globale Variable änderbar Java Basics - Anfänger-Themen 3
M Superglobale globale Variable? Java Basics - Anfänger-Themen 10
P Globale Variable Java Basics - Anfänger-Themen 3
J "globale" variable definieren? Java Basics - Anfänger-Themen 7
S Globale Variable / Methode Java Basics - Anfänger-Themen 5
P Globale Objekte Java Basics - Anfänger-Themen 2
S Vererbung/Globale Variablen Java Basics - Anfänger-Themen 8
Luk10 Globale (semi-finale) Varibalen Java Basics - Anfänger-Themen 9
U Globale Proxy Einstellungen ändern Java Basics - Anfänger-Themen 3
B Globale vector? Java Basics - Anfänger-Themen 7
B Methoden Globale Methoden "Toolbox" Java Basics - Anfänger-Themen 3
D globale Variablen zur Laufzeit erzeugen Java Basics - Anfänger-Themen 5
G Globale Variablen Java Basics - Anfänger-Themen 9
G Globale Variablen Java Basics - Anfänger-Themen 3
O globale variablen Java Basics - Anfänger-Themen 21
M Globale Variablen werden durch KeyListener nicht aktualisier Java Basics - Anfänger-Themen 10
G Müssen globale Funktionen immer "static" sein? Java Basics - Anfänger-Themen 13
A Globale Methode ohne imports und übergeben? Java Basics - Anfänger-Themen 2
P textfarbe,textgröße, textart als globale einstellung Java Basics - Anfänger-Themen 7
F Globale Variablen wie in C++? Java Basics - Anfänger-Themen 5
J "Globale Variablen" Java Basics - Anfänger-Themen 26
S globale Variablen Java Basics - Anfänger-Themen 9
D Globale Klassenvariablen. Java Basics - Anfänger-Themen 12
P Globale und ständige Überwachung eines Textfeldes auf text? Java Basics - Anfänger-Themen 40
J Globale Variablen Java Basics - Anfänger-Themen 3
D Globale Variablen Java Basics - Anfänger-Themen 31
C Globale Variablen und Array mit verschiedenen Typen Java Basics - Anfänger-Themen 3
S globale Variablen Java Basics - Anfänger-Themen 7
M Länge eines Arrays als Variable speichern möglich? Java Basics - Anfänger-Themen 14
R Liste in Variable speichern Java Basics - Anfänger-Themen 6
J Java long- in int-Variable umwandeln Java Basics - Anfänger-Themen 6
Nitrogames Variablen Variable aus JOptionPane Abfrage in Array einfügen Java Basics - Anfänger-Themen 4
E Variable von 1. Fenster an 2. Fenster übergeben. Java Basics - Anfänger-Themen 7
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
T Datum als Variable wert Java Basics - Anfänger-Themen 4
G Variable aktualisiert sich nicht in rekursiver Methode Java Basics - Anfänger-Themen 4
R Compiler-Fehler Variable wird nicht gefunden bzw. erkannt? Java Basics - Anfänger-Themen 2
Say super.methode / super.variable und super(variable) Java Basics - Anfänger-Themen 2
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
N Was Passiert mit dem Namen einer Variable, wenn man diese einer Liste Hinzufügt Java Basics - Anfänger-Themen 16
T Variable von Objekten in einer Methode überprüfen Java Basics - Anfänger-Themen 26
U Wie mache ich die Variable xyz eindeutig/unique? Java Basics - Anfänger-Themen 20
JordenJost char variable funktioniert irgendwie nicht a+b ergibt nicht à Java Basics - Anfänger-Themen 4
M Variable Felderanzahl Java Java Basics - Anfänger-Themen 10
T Variable durch Action Listener ändern Java Basics - Anfänger-Themen 2
stormyark Fehler beim überschreiben einer Variable Java Basics - Anfänger-Themen 1
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
S Eine Variable in einem Array speichern Java Basics - Anfänger-Themen 5
I Methoden Wieso wird mein Array "a" verändert und meine Variable "a" nicht? Java Basics - Anfänger-Themen 4
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
W Schleife und einmal variable++ zu viel Java Basics - Anfänger-Themen 20
M String mit Variable vergleichen Java Basics - Anfänger-Themen 9
M Methoden Wert einer Variable geht verloren? Java Basics - Anfänger-Themen 6
G variable kopieren bzw. woanders benutzen Java Basics - Anfänger-Themen 6
Ameise04 Variablen Inhalt einer Variable im Code verwenden? Java Basics - Anfänger-Themen 9
J Double Variable und Addition Java Basics - Anfänger-Themen 2
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
KogoroMori21 Variable im Parameter und Ohne Java Basics - Anfänger-Themen 5
Vivien Auf eine Variable von einer anderen Klasse aus zugreifen Java Basics - Anfänger-Themen 3
H Datentypen Wertebereich von <Klassenname> <Variable> Java Basics - Anfänger-Themen 12
M Private Variable Java Basics - Anfänger-Themen 2
idontknow707 Matrix nach z.B. Variable durchsuchen Java Basics - Anfänger-Themen 4
T Variable in for Schleife ansprechen ohne Array ? Java Basics - Anfänger-Themen 25
s.marcii Modulo in der Variable einsetzen - ist das möglich? Java Basics - Anfänger-Themen 2
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
Y Wie kann ich die Variable in der Try Catch returnen? Java Basics - Anfänger-Themen 3
K Übergabe des Wertes einer Variable aus main() in eine Klassenmethode Java Basics - Anfänger-Themen 8
B Inkrement von Variable Java Basics - Anfänger-Themen 8
V Variablen statische Variable einer Objektvariable zuordnen Java Basics - Anfänger-Themen 3
L Variable von einer Methode zu einer anderen Methode inkl. einer "Zwischenmethode" Java Basics - Anfänger-Themen 1
J JTextField Bezeichnung als Variable Java Basics - Anfänger-Themen 3
N Wie kann ich eine meine Variable Final machen? Java Basics - Anfänger-Themen 1
NeoLexx Variable für Array wird nicht korrekt übergeben Java Basics - Anfänger-Themen 45
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
H Variable um 1 erhört ausgeben Java Basics - Anfänger-Themen 4
V Erste Schritte Eine Array-Variable mit Benutzereingaben befüllen Java Basics - Anfänger-Themen 3
J Fehlermeldung unklar. non-static variable player0 cannot be referenced from a static context Java Basics - Anfänger-Themen 4
P non-static variable cannot be referenced from a static context Java Basics - Anfänger-Themen 6
A Wie zwei zahlen in einer Variable speichern? Java Basics - Anfänger-Themen 7
W Problem mit dem Wert von boolean-Variable Java Basics - Anfänger-Themen 3
M Input/Output JTextField Eingabe in String Variable speichern Java Basics - Anfänger-Themen 15
A Kann man eine Methode als Variable speichern und danach noch verändern? Java Basics - Anfänger-Themen 6
L cannot find symbol variable Kon Java Basics - Anfänger-Themen 8
C Statischer Typ aber Variable nicht statisch? Java Basics - Anfänger-Themen 5
H Variable.methode aufstellen, verstehen Java Basics - Anfänger-Themen 2
R Warnung, wenn eine Variable eingegeben wird Java Basics - Anfänger-Themen 6
S Variable einscannen Java Basics - Anfänger-Themen 30
N Best Practice Rückgabe eines Terminal Befehls in eine Variable speichern Java Basics - Anfänger-Themen 27
M Erste Schritte Mit Variable verschiedene Texte in Textfeld einfügen Java Basics - Anfänger-Themen 27
J Input-Variable nicht sichtbar Java Basics - Anfänger-Themen 2
L Warum ist Variable null? Java Basics - Anfänger-Themen 3

Ähnliche Java Themen

Neue Themen


Oben