paint-Methode kopiert GUI

  • Themenstarter Themenstarter Guasto
  • Beginndatum Beginndatum
G

Guasto

Gast
Hallo, Community,
ich habe folgendes Problem:
Ich möchte auf einen JPanel einen String zeichnen.
Dazu habe ich eine Klasse geschrieben, die JPanel erweitert.
Wenn ich aber nun in der paint-Methode den String "in Auftrag gebe" wird ein Teil eines anderen Panels (mit Buttons, Comboboxen und co.) kopiert und auf einmal zeichnet der Panel statt des Strings diverse Buttons, eine JColorChooser und einige JXTaskpanes.
Es ist, als ob (nee, es IST einfach so), das Programm einfach ein Bildschirmfoto von dem anderen Panel macht und auf die Stelle, wo der String hingehört zeichnet.

Hier der Codeausschnitt:
Java:
g2.setFont(textAnimation.getFont());
g2.setColor(textAnimation.getFarbe());
g2.drawString(textAnimation.getText(), 50, this.getHeight() / 2 - 40);
Font, Farbe und text sind alle gesetzt...
Jemand eine Idee?
 
Aus deinen Codezeilen ist kein Fehler erkennbar. Interessant sind wohl folgende Informationen:
- Wie sieht die gesamte überschriebene paint-Methode aus (also eigentlich sollte man nur
Code:
paintComponent()
überschreiben ...)
- Wie wird die GUI denn zusammen-gelayoutet?
 
1.)Zur GUI: Ich habe einen JFrame, rechts ist eine Leiste (JPanel, GridLayout) und links dad Panel, wo der String erscheinen soll.
2.)Die Methode sieht folgendermaßen aus:
Java:
@Override
    public void paint(Graphics g) {
        g2 = (Graphics2D) g;
        g2.setFont(textAnimation.getFont());
        g2.setColor(textAnimation.getFarbe());
        g2.drawString(textAnimation.getText(), 50, this.getHeight() / 2 - 40);
    }
Ich versuche es mal mit paintComponent.
3.)Nein, super.paint() habe ich noch nicht aufgerufen, werde es aber gleich mal damit versuchen.

Danke erstmal, habe mit so präzisen Vorschlägen und eventuellen Lösungswegen gar nicht gerechnet.
 
Also, hab die Vorschlöge (also mit paintComponent() und super.paint()) mal probiert.
Das Gute daran: Das Programm kopiert keinen Teil der GUI mehr.
Das Schlechte: Der String erscheit auch nicht und ich bekomme folgende Exception:
Java:
Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
        at java.awt.Component.getFont_NoClientCode(Component.java:1757)
        at java.awt.Component.getFont(Component.java:1749)
        at javax.swing.JComponent.getComponentGraphics(JComponent.java:713)
        at javax.swing.JComponent.paint(JComponent.java:974)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
        at animatepro.AnimationPanel.paintComponent(AnimationPanel.java:31)
        at javax.swing.JComponent.paint(JComponent.java:1029)
Ich habe die jetzt mal stark gekürzt, so geht es noch ziemlich lange weiter 🙁
Die ansgesprochene Zeile 31 ist folgende:
Java:
super.paint(g);
 
Entschuldigt bitte den erneuten post, aber ich habe das ganze jetzt einmal ohne die offensichtlich problematische Zeit versucht und dabei festgestellt:
Es wird wieder ein Teil der GUI kopiert - der String ist zu sehen...
 
Der Stackoverflow lässt darauf schließen, dass eine unendliche Rekursion ensteht, soll heißen, dass die methode sich (direkt oder indirekt) selbst aufruft und das unendlich oft.
Kann es sein, dass du in der paintComponent methode super.paint aufrufst?
Wenn ja, dann versuch mal stattdessen super.paintComponent aufzurufen, evtl. hilfts ja was.
Ich weiß leider auch nicht genau, wie paint und paintComponent zusammenhängen, aber es könnte sein, dass paint paintComponent aufruft.
Und wenn du dann in paintComponent wieder paint aufrufst, ist ja klar, dass nen stackoverflow kommt.
Ich denke, genau das ist bei dir passiert.

Übrigens: Hat das Forum bei euch auch gerade Anzeigefehler?
 
Nein,das hilft leider auch nicht...
Oder sollte ich das mit dem super.paintComponent(); besser im Konstruktor aufrufen?
Ja, bei mir schaut's auch komisch aus 🙂
 
Du kriegst immer noch den Stackoverflow?

Wenn ja, dann poste nochmal die aktullle paint und/oder paintComponent methode bitte.
 
wenn du die paintComponent überschreibst sollte das später so aussehen:

Java:
@Override
public void paintComponent(Graphics g) {
    super.paintComponent(g);
    // dein code
}
(nicht verwechseln mit der methode paintComponents... da schleicht sich gern mal ein s zuviel ein.
 
Ach, habe ich gar nicht gekuckt...
Nee, keine Exception mehr, aber funktionieren tut's trotzdem nicht...
 
Ja, so schaut's auch aus...
Nur macht vielleicht das einen Unterschied:
g2 = (Graphics2D) g;??
Ansonsten bin ich ziemlich ratlos,

PS @EikeB: Ich meine ich hätte dich schonmal gefragt, wenn ja dann sorry aber: kommst du aus Bennigsen?
 
Nein das macht meinen unterschied.

Und ja, hast mich schonmal gefragt, und nein, ich komm da nich her
 
Oha, ich verpasse immer die letzte Antwort^^
Äh, ich glaube es wird ziemlich schwierig, ein KSKB anzufertigen...
Und kurz würde es ganz bestimmt nicht...
 

Neue Themen


Zurück
Oben