Wann existiert eine Instanz (eigene Klasse)

Sneedlewoods

Mitglied
Hallo,

ich habe eine eigene Klasse, abgeleitet von JLabel

Java:
public class TextLink extends JLabel {
    Rectangle2D bounds;
    int posX;
    int posY;
    ...
    public TextLink(String text, Font f, int x, int y) {
        //Konstruktor
        this.setText(text);
        this.setFont(f);
        posX = x;
        posY = y;
        getStringBounds();
    }

    private void getStringBounds() {
        //zur ermittlung von Breite und Höhe des Textes in Bezug auf einen
        //bestimmten Font
        FontMetrics metrics = this.getGraphics().getFontMetrics();
        bounds = metrics.getStringBounds(this.getText(), this.getGraphics());
    }
 
    ...   
}

Da bekomme ich jetzt eine NullPointerException. Ich vermute dass es evtl. an dem this.getGraphics liegt, was ja im Konstruktor über getStringBounds() aufgerufen wird.

Was ich will ist, dass wenn TextLink erzeugt wird, automatisch bounds gefüllt wird.

Kann mir da jemand helfen?
Danke Sneedle
 

Highchiller

Bekanntes Mitglied
Du setzt in deinem Konstruktor zwar die Font für das JLabel, aber dein JLabel selbst besitzt überhaupt kein Graphics Objekt. Entsprechend gibt dir getGraphics() natürlich null zurück.

Aber ein JLabel bzw ein Component besitzt selbst die Methode: getFontMetrics(). Wieso verwendest du die nicht?

Java:
FontMetrics metrics = this.getFontMetrics();

PS: Man ich muss echt schneller werden XDDD
Ruf mal super (); im Konstruktor auf. Klappt das?
Das klappt nicht :) Dachte ich aber auch zuerst. Aber Graphics ist trotzdem null ;)
 
Zuletzt bearbeitet:

Sneedlewoods

Mitglied
@ARadauer
mit super(); klappts leider nicht

@Highchiller
hm also des find ich jetzt komisch. Weil
Java:
JLabel l = new JLabel("Test");
Graphics g = l.getGraphics();
da meckert er nicht.
Weshalb ich ein Graphics-Object verwende: beim Googlen bin ich darauf gestoßen, dass getFontMetrics der Komponenten keine genauen Pixel-Angaben liefern, da sie z.B. Aliasing nicht berücksichtigen. Das getFontMetrics vom Graphics-Object soll da genauer sein.
 

Highchiller

Bekanntes Mitglied
Es könnte daran liegen, dass ein JLabel, wenn es leer ist, eine Größe von 0/0 hat und dementsprechend gar nicht gezeichnet wird ergo auch kein Graphics objekt instanziiert hat. Wenn du jetzt ein JLabel objekt mit dem Text "Test" erzeugst, steht ja was drinne und damit wäre getGraphics nicht mehr null.

Ist aber nur eine vermutung. Check das doch mal wenn du in deinem Beispiel statt new JLabel("Test"); einfach nur new JLabel(); machst. Ist getGraphics dann null?

Also es würde mich wundern wenn dir da Probleme begegnen weil das nicht genau genug ist.

Zur Not musste halt selbst ein Graphics objekt erzeugen und erst mal damit arbeiten. In weit das Probleme bringt weiß ich allerdings nicht.
 

Sneedlewoods

Mitglied
@Highchiller
ja dass ist auch meine Vermutung, dass das Graphics-Object von JLabel noch nicht angelegt ist, während der Konstruktor aktiv ist.
Ein Extra-Graphics-Object erzeugen will ich eigentlich nicht, da es ja die Einstellungen vom JLabel haben soll. Das wäre für mein Empfinden dann unschön.

Natürlich kann ich in der JFrame-Klasse, ein JLabel erzeugen und danach alles machen, aber ich wollte es ja in die eigene Klasse auslagern. Das muss doch irgendwie möglich sein.

Ich hatte sogar auch folgendes probiert, was aber den gleichen Fehler erzeugte:

Java:
    public class TextLink extends JLabel {
        Rectangle2D bounds;
        int posX;
        int posY;
        ...
        public TextLink(String text, Font f, int x, int y) {
            //Konstruktor
            this.setText(text);
            this.setFont(f);
            posX = x;
            posY = y;
        }
        
        public void init() {
            getStringBounds();
        }

        private void getStringBounds() {
            //zur ermittlung von Breite und Höhe des Textes in Bezug auf einen
            //bestimmten Font
            FontMetrics metrics = this.getGraphics().getFontMetrics();
            bounds = metrics.getStringBounds(this.getText(), this.getGraphics());
        }
     
        ...  
    }

    //Main - Klasse
    public class MyFrame extends JFrame{
        TextLink start;
        Font menuFont;
    
        public MyFrame() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(null);
            this.setSize(800, 600);
            menuFont = new Font("Tahoma", Font.PLAIN, 10);
            //start = makeTextLink("Start", 50, 50);
            this.setVisible(true);
            JLabel l = new JLabel("Test");
            Graphics g = l.getGraphics();
        }
    
        public TextLink makeTextLink(String text, int x, int y) {
            TextLink tl = new TextLink(text, menuFont, x, y);
            this.add(tl);
            return tl;
         }
        
        public static void main(String[] args) {
            MyFrame menu = new MyFrame();
        }
}

und init() habe ich dann nach TextLink tl = new Textlink();
aufgerufen.

Oh jetzt seh ich gerade, hängt das evtl. damit zusammen, dass ich das Ganze im Konstruktor von MyFrame aufrufe und ich damit den ganzen Existiert-Es-Kram auslöse? Also wie gehe ich dann vor? Es soll ja alles automatisch angelegt werden, aber ich muss es wohl dann explizit aufrufen (nachdem der Konstruktor fertig ist) ?
 

Highchiller

Bekanntes Mitglied
Nee die Sache ist etwas komplizierter. Es liegt nicht daran das von deinem JLabel noch kein Objekt instanziiert wurde weil du noch im Konstruktor hängst, deine Überschrift hat mit deinem Problem leider überhaupt nichts zu tun.

Ich hab jetzt rausgefunden dass ein Graphics object auf einer Component erst instanziiert wird, wenn die Component auch tatsächlich gezeichnet wird. Solange du also nicht irgendwo auf einen Frame (der natürlich auch dein Label enthält) nicht setVisible(true); aufrufst, ist deine Graphics objekt null. Daran lässt sich leider auch nicht wirklich was ändern.

Wie dem auch sei. Ich hab mal einen kleinen Test geschrieben. Wenn ich mir vom String "Test" in Arial, Bold und Schriftgröße 12 die bounds ausrechnen lasse, aber erst NACH dem zeichnen, also mit dem richtigen Graphics objekt das du immer willst. Bekomme ich:
[x=0.0,y=-11.05957,w=25.0,h=13.798828]

Und wenn ich das ganze mit dem Vorschlag von mir tue, also einfach getFontMetrics vom Component benutze, also direkt vom JLabel aus getFontMetrics aufrufe erhalte ich:
[x=0.0,y=-11.05957,w=25.0,h=13.798828]

Also ich seh kein Unterschied :D
Ist dir das genau genug? Kurz um, s***** aufs Aliasing und benutz einfach getFontMetrics. Das ist für deine Aufgaben bei weitem genau genug ;)
 

Sneedlewoods

Mitglied
Wow danke für die Mühe.

Also ich werd Deinem Rat folgen und getFontMetrics der Komponente verwenden, ABER :D

zuerst probier ich einfach TextLink.setVisible(true); bevor ich das Graphics benutze, mal schauen. Wenn es so klappt, dann meld ich mich wieder, ansonsten benutze ich Deinen Weg.

Danke.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
KogoroMori21 Wann ist der richtige Zeitpunkt, um sich Hilfe zu suchen? (Bin Informatik-Student) Java Basics - Anfänger-Themen 10
I Logik Zahlungsprozess - Wann Bestellobjekt anlegen? Java Basics - Anfänger-Themen 2
C Java Array Struktur, welche ist wann besser? Java Basics - Anfänger-Themen 12
berserkerdq2 Java streams, wann nutze ich ::, also 2x Doppelpuntk bei Streams? Java Basics - Anfänger-Themen 5
W Wann und warum hashcode und equals? Java Basics - Anfänger-Themen 14
W Wann Rückgabewerte 0, 1, -1? Java Basics - Anfänger-Themen 27
berserkerdq2 Wann soll ich den Stream schließen, wenn ich das in einer Methode habe? Java Basics - Anfänger-Themen 8
K In andere Zahlensysteme umwandeln, wann klappt immer der Trick mit log? Java Basics - Anfänger-Themen 6
W Zur Vererbung: Wann und wie? Java Basics - Anfänger-Themen 35
F Wann ist es eine Instanz und wann nicht? Java Basics - Anfänger-Themen 1
C Instanzen, wann muss ich Instanzen erzeugen & wo?) Java Basics - Anfänger-Themen 23
S Wann Methode abstract? Java Basics - Anfänger-Themen 10
S Wann buffer löschen? Java Basics - Anfänger-Themen 5
R Wie überprüfen wann der User online oder offline ist? Java Basics - Anfänger-Themen 5
C Polymorphie Was genau ist Polymorphie und wann genau sollte man es verwenden? Java Basics - Anfänger-Themen 9
I Wann ist Client plattformunabhängig? Java Basics - Anfänger-Themen 22
M Best Practice Wann eine Methode schreiben ? Java Basics - Anfänger-Themen 14
K Warum funktioniert das und wann erden die Objektmethoden nun ausgeführt? Java Basics - Anfänger-Themen 7
IngoF Welches Event kommt wann? Java Basics - Anfänger-Themen 8
M Wann eigene implementierte HashCode Methode zwingend erforderlich? Java Basics - Anfänger-Themen 1
X Wann schreibt man diese Syntax zeichen { } Java Basics - Anfänger-Themen 8
O Wann nutzt man static? Java Basics - Anfänger-Themen 19
C Klassendesign / Wann Interface implementieren und wann Klassen vererben? Java Basics - Anfänger-Themen 3
M Wann PATH und wann JAVA_HOME in Windows System 7 setzen? Java Basics - Anfänger-Themen 2
M Wann final verwenden? Java Basics - Anfänger-Themen 5
M Wann eine Wrapper Klasse verwenden und wann einen primitiven Datentypen? Java Basics - Anfänger-Themen 8
D Ab wann getter und setter Java Basics - Anfänger-Themen 2
B Erkennen, wann static oder nicht? Java Basics - Anfänger-Themen 7
E wann welche Konstanten verwenden? Java Basics - Anfänger-Themen 7
P Wann Byte-Stream und wann Character-Stream? Java Basics - Anfänger-Themen 11
T Vererbung Wann wird die Methode paint aufgerufen? Java Basics - Anfänger-Themen 4
M Wann statische Methoden/Attribute? Java Basics - Anfänger-Themen 2
vandread Java Wildcards - Wann super wann extends? Java Basics - Anfänger-Themen 2
K Wann Vererbung und wann Interface verwenden? Java Basics - Anfänger-Themen 12
D Wann genau nutze ich ein solches Interface? Java Basics - Anfänger-Themen 3
K Wann genau brauche ich die Anweisung gleich null? Java Basics - Anfänger-Themen 10
B Wann toString() überschreiben? Java Basics - Anfänger-Themen 21
S OOP Wann Proxies und Interfaces? Java Basics - Anfänger-Themen 3
P Threads Wann läuft es parallel ab ? Java Basics - Anfänger-Themen 4
C Variablen Wann werden Instanzvariablen initalisiert? Java Basics - Anfänger-Themen 10
P Java Stream, wann welche Stream verwenden? Java Basics - Anfänger-Themen 3
T Ab wann ist es ein großes Projekt? Java Basics - Anfänger-Themen 35
N Bessere Performance durch final: wann denn überhaupt? Java Basics - Anfänger-Themen 28
D Wann genau abstrakte Klasse und wann ein Interface verwenden? Java Basics - Anfänger-Themen 4
W Wann nutze ich "import"? Java Basics - Anfänger-Themen 12
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
H Wann ein Objekt der Programmklasse in main anlegen Java Basics - Anfänger-Themen 2
G Wann ist ein == Vergleich bei Gleitkommazahlen fahrlässig? Java Basics - Anfänger-Themen 8
T Wann for und wann while?? Java Basics - Anfänger-Themen 35
-horn- Wann wird alles NaN erzeugt? Java Basics - Anfänger-Themen 22
S Wann wird eine Klasse geladen? Java Basics - Anfänger-Themen 17
C this - wann verwende ich das? Java Basics - Anfänger-Themen 10
T Threads - Ab wann wirds Kritisch?! Java Basics - Anfänger-Themen 7
M Wann muss man eine Variable mit set-/get-Methoden in eine Bean schreiben? Java Basics - Anfänger-Themen 19
G field public/private wann Java Basics - Anfänger-Themen 11
GambaJo Ab wann neue Klasse erzeugen? Java Basics - Anfänger-Themen 2
G Wann Arrays, wann Collections? Java Basics - Anfänger-Themen 36
GambaJo Wann try.catch nutzen? Java Basics - Anfänger-Themen 11
B objekt wann als final deklarieren? Java Basics - Anfänger-Themen 2
N Wann muss eine Methode - protected sein wann public wann. Java Basics - Anfänger-Themen 5
Y Wann / Wozu inner class Java Basics - Anfänger-Themen 3
K StringBuilder notwendig ab wann? Java Basics - Anfänger-Themen 42
S wann static Funktionen wann nicht Java Basics - Anfänger-Themen 6
N Wann und wie oft finalize Methode verwenden( überschreiben ) Java Basics - Anfänger-Themen 6
Bernasconi Programmierstil / Wann eine neue Datei? Java Basics - Anfänger-Themen 5
M wann, welche schleife Java Basics - Anfänger-Themen 3
M Ab wann ist die Datei sichtbar? Java Basics - Anfänger-Themen 3
G Herausfinden, wann mehrere Threads abgeschlossen sind Java Basics - Anfänger-Themen 3
G Überprüfen wann ein Dokument abläuft? Java Basics - Anfänger-Themen 3
N SAX, StAX, JDOM oder DOM , ab wann welches für XML Java Basics - Anfänger-Themen 14
M Wann ist ein Programm beendet? Java Basics - Anfänger-Themen 6
G Wann am besten getSize() aufrufen? Java Basics - Anfänger-Themen 6
I Festellen wann Methode in anderer Klasse fertig ist Java Basics - Anfänger-Themen 5
M wann statische klassen? Java Basics - Anfänger-Themen 14
M Wann ist initialisieren sinnvoll? Java Basics - Anfänger-Themen 4
B Wann Comparator und wann Comparable Java Basics - Anfänger-Themen 6
R Wann benutzt man << oder >> ? Java Basics - Anfänger-Themen 2
G Klassen: Wann initialisiere ich wo meine Variabeln Java Basics - Anfänger-Themen 6
B von Java/Eclipse verwendete Datei existiert gar nicht? Java Basics - Anfänger-Themen 6
berserkerdq2 Hashmap, wie prüfe ich ob ein Key schon existiert Java Basics - Anfänger-Themen 19
E Mysql Update wenn es nicht existiert insert Java Basics - Anfänger-Themen 14
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
P JDK installieren javac behauptet Javax.swing existiert nicht Java Basics - Anfänger-Themen 8
L Vererbung auf Methode einer abgeleiteten Klassezu greifen, die nicht in allen abgeleiteten existiert Java Basics - Anfänger-Themen 3
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
M Klassen Existiert sowas wie ein ExceptionThrowEvent? Java Basics - Anfänger-Themen 9
C Check ob eine HashMap schon existiert Java Basics - Anfänger-Themen 16
W Test, ob Datei existiert, schlägt fehl Java Basics - Anfänger-Themen 4
I Prüfen ob Webseite existiert Java Basics - Anfänger-Themen 3
N Prüfen ob Objekt existiert Java Basics - Anfänger-Themen 6
A Prüfen ob Datei existiert Java Basics - Anfänger-Themen 9
D Mysql ob feld existiert Java Basics - Anfänger-Themen 2
M Existiert der gegebene Pfad? Java Basics - Anfänger-Themen 5
D Mysql schauen Name bereits existiert Java Basics - Anfänger-Themen 7
I Null als return obwohl datensatz existiert Java Basics - Anfänger-Themen 12
O Existiert eine Beschränkung beim unzippen von Dateien? Java Basics - Anfänger-Themen 4
G Prüfen ob array[1] existiert wegen OutofBounds! Java Basics - Anfänger-Themen 4
L Filenotfound Exception bei java.io obwohl file existiert Java Basics - Anfänger-Themen 10
B Programm existiert? (Linux) Java Basics - Anfänger-Themen 2
C Wenn Wert existiert, dann weiter auf nächste Seite Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben