Paint und paintComponent

PowerOfMac

Mitglied
Hallo Java-Fans,

ich beiße mir seit einer geraumen Weile an paint() und paintComponent() Methoden von JFrames die Zähne aus. Zur Illustration meines Problems habe ich mal ein Beispielprogramm geschrieben:

import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class WindowedWindow extends JFrame
{
public WindowedWindow (String name, int width, int height)
{
super (name);
setSize (width, height);
setLocationRelativeTo (null);
setResizable (false);
setUndecorated (false);
setFocusableWindowState (true);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

setVisible (true);
}

public void paintComponent (Graphics g)
{
g.setColor (Color.blue);
g.fillRect (50, 50, 500, 500);
}

public static void main (String [] args)
{
WindowedWindow window = new WindowedWindow ("Test", 800, 600);
}
}

Anhand dessen kann man sehen, dass paintComponent() bei JFrames nicht funktioniert (zumindest bei mir nicht). Nun gut, gelöst habe ich das Problem mit der Verwendung von paint() statt paintComponent() (obwohl man das ja wohl eigentlich nicht machen soll). Nun schmeißt mir das bei meinem neuesten Projekt leider eine seltsame Exception raus:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MapEdit.DS2Window.paint(DS2Window.java:36)
at javax.swing.RepaintManager$3.run(RepaintManager.java:822)
at javax.swing.RepaintManager$3.run(RepaintManager.java:794)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:794)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Gerne krieg ich die auch mehrmals hintereinander. Manchmal wird das Bild trotzdem scheinbar ordnungsgemäß gezeichnet, manchmal bleibt der Bildschirm aber auch einfach weiß. Ich hab noch nicht rausgefunden was genau die Exception auslöst, bzw. wie ich sie vermeiden kann. Kann mir da jemand helfen? Was zur Hölle sind DirtyRegions?

Hier noch mal der Code, der die Exception auslöst:

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;

public class DS2Window extends FullscreenWindow
{
/*Auflösung des GUI*/
final static int RES_WIDTH = 1280;
final static int RES_HEIGHT = 800;

DS2Panel drawarea;
BackgroundArea background;
BufferedImage offimg;
Graphics2D g2d1;
Graphics2D g2d2;

DS2Window (String name)
{
super (name);
setLayout (null);

setBounds (0, 0, getWidth (), getHeight ());

background = new BackgroundArea ();
add (background);

/*Double-Buffering, um das GUI in der korrekten Auflösung, ohne schwarzen Rand, darzustellen*/
offimg = GraphicsEnvironment.getLocalGraphicsEnvironment ().getDefaultScreenDevice ().getDefaultConfiguration ().createCompatibleImage (DS2Window.RES_WIDTH, DS2Window.RES_HEIGHT);
g2d1 = (Graphics2D) (offimg.createGraphics ());
}

public void paint (Graphics g)
{
background.paintArea (g2d1);

g2d2 = (Graphics2D) (g);
g2d2.drawImage (offimg, 0, 0, getWidth (), getHeight (), this);
}
}

//background.paintArea ()
public void paintArea (Graphics2D g2d)
{
g2d.setColor (BackgroundArea.BACKGROUND);
g2d.fillRect (0, 0, DS2Window.RES_WIDTH, DS2Window.RES_HEIGHT);

map.paintArea (g2d);
info.paintArea (g2d);
}

Nun habe ich mich ich mich für besonders clever gehalten und habe ein Panel von der Größe des Fensters als Grundfläche benutzt, also nicht mehr die paint() des DS2Window sondern die paintComponent() des neuen Panels verwendet, um die Objekte auf dem Bildschirm zu zeichnen. Diese Lösung hat sich schon bei früheren Projekten bewährt, aber diesmal haut sie nicht hin. Ich krieg damit wieder dasselbe Problem wie mit der paintComponent() von JFrame, also weißer Bildschirm und bei Benutzung von paint() die seltsame Exception.
Weiß jemand, wie mir zu helfen ist? Wie zeichnet ihr eure GUI's, wenn ihr nicht gerade Swing verwendet? Und wo kommt ist die Nullpointer-Exception her?

Danke im Voraus für eure Mühe!

PS: sorry, dass ich keine Codetags verwendet habe, ich kann grad nur vom Handy aus posten, da ist das leider schwierig :(
 

Network

Top Contributor
Das was mein Vorgänger geschrieben hat ist sehr wichtig. Also fetter und roter hätte man es nicht machen können. Versuche bitte mal deinen eigenen Post zu lesen.

Und selbstverständlich wäre ein KSKB sehr hilfreich.
 
Zuletzt bearbeitet:

PowerOfMac

Mitglied
Hallo Java-Fans,

ich beiße mir seit einer geraumen Weile an paint() und paintComponent() Methoden von JFrames die Zähne aus.
Zur Illustration meines Problems habe ich mal ein Beispielprogramm geschrieben:


Java:
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class WindowedWindow extends JFrame
{
public WindowedWindow (String name, int width, int height)
{
super (name);
setSize (width, height);
setLocationRelativeTo (null);
setResizable (false);
setUndecorated (false);
setFocusableWindowState (true);
setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

setVisible (true);
}

public void paintComponent (Graphics g)
{
g.setColor (Color.blue);
g.fillRect (50, 50, 500, 500);
}

public static void main (String [] args)
{
WindowedWindow window = new WindowedWindow ("Test", 800, 600);
}
}

Anhand dessen kann man sehen, dass paintComponent() bei JFrames nicht funktioniert (zumindest bei mir nicht). Nun gut, gelöst habe ich das Problem mit der Verwendung von paint() statt paintComponent() (obwohl man das ja wohl eigentlich nicht machen soll). Nun schmeißt mir das bei meinem neuesten Projekt leider eine seltsame Exception raus:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at MapEdit.DS2Window.paint(DS2Window.java:36)
at javax.swing.RepaintManager$3.run(RepaintManager.java:822)
at javax.swing.RepaintManager$3.run(RepaintManager.java:794)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:794)
at javax.swing.RepaintManager.paintDirtyRegions(RepaintManager.java:769)
at javax.swing.RepaintManager.prePaintDirtyRegions(RepaintManager.java:718)
at javax.swing.RepaintManager.access$1100(RepaintManager.java:62)
at javax.swing.RepaintManager$ProcessingRunnable.run(RepaintManager.java:1680)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:744)
at java.awt.EventQueue.access$400(EventQueue.java:97)
at java.awt.EventQueue$3.run(EventQueue.java:697)
at java.awt.EventQueue$3.run(EventQueue.java:691)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:714)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Gerne krieg ich die auch mehrmals hintereinander. Manchmal wird das Bild trotzdem scheinbar ordnungsgemäß gezeichnet, manchmal bleibt der Bildschirm aber auch einfach weiß. Ich hab noch nicht rausgefunden was genau die Exception auslöst, bzw. wie ich sie vermeiden kann. Kann mir da jemand helfen? Was zur Hölle sind DirtyRegions?

Hier noch mal der Code, der die Exception auslöst:

Java:
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import java.awt.image.BufferedImage;

public class DS2Window extends FullscreenWindow
{
/*Auflösung des GUI*/
final static int RES_WIDTH = 1280;
final static int RES_HEIGHT = 800;

DS2Panel drawarea;
BackgroundArea background;
BufferedImage offimg;
Graphics2D g2d1;
Graphics2D g2d2;

DS2Window (String name)
{
super (name);
setLayout (null);

setBounds (0, 0, getWidth (), getHeight ());

background = new BackgroundArea ();
add (background);

/*Double-Buffering, um das GUI in der korrekten Auflösung, ohne schwarzen Rand, darzustellen*/
offimg = GraphicsEnvironment.getLocalGraphicsEnvironment ().getDefaultScreenDevice ().getDefaultConfiguration ().createCompatibleImage (DS2Window.RES_WIDTH, DS2Window.RES_HEIGHT);
g2d1 = (Graphics2D) (offimg.createGraphics ());
}

public void paint (Graphics g)
{
background.paintArea (g2d1);

g2d2 = (Graphics2D) (g);
g2d2.drawImage (offimg, 0, 0, getWidth (), getHeight (), this);
}
}

//background.paintArea ()
public void paintArea (Graphics2D g2d)
{
g2d.setColor (BackgroundArea.BACKGROUND);
g2d.fillRect (0, 0, DS2Window.RES_WIDTH, DS2Window.RES_HEIGHT);

map.paintArea (g2d);
info.paintArea (g2d);
}

Nun habe ich mich ich mich für besonders clever gehalten und habe ein Panel von der Größe des Fensters als Grundfläche benutzt, also nicht mehr die paint() des DS2Window sondern die paintComponent() des neuen Panels verwendet, um die Objekte auf dem Bildschirm zu zeichnen. Diese Lösung hat sich schon bei früheren Projekten bewährt, aber diesmal haut sie nicht hin. Ich krieg damit wieder dasselbe Problem wie mit der paintComponent() von JFrame, also weißer Bildschirm und bei Benutzung von paint() die seltsame Exception.
Weiß jemand, wie mir zu helfen ist? Wie zeichnet ihr eure GUI's, wenn ihr nicht gerade Swing verwendet? Und wo kommt ist die Nullpointer-Exception her?

Danke im Voraus für eure Mühe!
 

PowerOfMac

Mitglied
So, dass hat vom Handy aus ne halbe Stunde gedauert. Vermutlich sagt ihr mir als nächstes, dass die Exception unleserlich ist aber Tooltips gehen am iPhone nu mal nicht auf, also hab ich null Plan welches der 150 Symbole da oben für Exceptiontags ist.
 
Zuletzt bearbeitet:

knilch

Bekanntes Mitglied
Hi,
Anhand dessen kann man sehen, dass paintComponent() bei JFrames nicht funktioniert (zumindest bei mir nicht).
Wenn du override von paintComponent() machst, dann musst du das so machen:
Java:
public void paintComponent (Graphics g) {
   super.paintComponent(g); 
   g.setColor (Color.blue);
   g.fillRect (50, 50, 500, 500);
}
 

PowerOfMac

Mitglied
Danke für die konstruktive Antwort. Ich probier dann gleich mal den super-Aufruf einzubinden. Kannst du mir auch was zu der Exception erklären? :oops:
 

kaoZ

Top Contributor
Ich vermute stark das zu dem Zeitpunkt an welchem du Zeichen möchtest dein Graphics Object noch nicht vollständig initialisiert ist und deshalb die NPE fliegt, und außerdem , warum greifst du in die paint/paintComponent methode deines JFrames ein ? und nicht die eines Panels den du als content in das JFrame setzen möchtest, so wie es für gewöhnlich gemacht wird, der JFrame ist eben im normalfall nur dein "Rahmen" für das was du in deiner GUI darstellen möchtest.
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Hi,

Wenn du override von paintComponent() machst, dann musst du das so machen:
Java:
public void paintComponent (Graphics g) {
   super.paintComponent(g); 
   g.setColor (Color.blue);
   g.fillRect (50, 50, 500, 500);
}
Die Klasse JFrame hat keine paintComponent(Graphics g) Methode!
Bitte wie Kaoz gesagt hat, von JPanel oder JComponent ableiten!
 

Harry Kane

Top Contributor
Ein JFrame ist zwar eine java.awt.Component, aber keine javax.swing.JComponent.
Dir ist aber schon klar, daß solche basics nur eine google-Suche entfernt sind?
 

PowerOfMac

Mitglied
Ok. Hab jetzt von einem JPanel abgeleitet und super.paintComponent() eingebaut. Hat nicht geholfen. Habe dann den Fehler gefunden: ein anderes JPanel, welches ich noch nicht einmal benutzt habe hat das erste Panel verdeckt.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
M Unterschied zwischen paintComponent() und paint()? AWT, Swing, JavaFX & SWT 4
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
T Klassenobjekte in paintComponent()/ paint() leer AWT, Swing, JavaFX & SWT 3
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
krgewb 2D-Grafik paint-Methode wird zu oft ausgeführt AWT, Swing, JavaFX & SWT 5
S Zeichen ohne paint-Methode AWT, Swing, JavaFX & SWT 2
J Swing Wann brauche ich @Override vor der paint()-Methode? AWT, Swing, JavaFX & SWT 1
G Eine paint-Methode, 2 Welten? AWT, Swing, JavaFX & SWT 3
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
L Berechnungen in paint AWT, Swing, JavaFX & SWT 8
S Grafik: Programm kommt nicht zur paint()-Methode AWT, Swing, JavaFX & SWT 6
W Paint-Methode in anderer Klasse funktioniert nicht AWT, Swing, JavaFX & SWT 7
S 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
F 2D-Grafik Was ruft die Paint - Methode auf ? AWT, Swing, JavaFX & SWT 2
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
S Paint Methode ohne implements JPanel AWT, Swing, JavaFX & SWT 1
S Farbe ändern bei der paint-Methode AWT, Swing, JavaFX & SWT 5
J ActionListener soll auf paint() Methode zugreifen AWT, Swing, JavaFX & SWT 1
J Problem mit der paint Methode AWT, Swing, JavaFX & SWT 0
Junb 2D-Grafik paint() Methode bugt? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
A Swing Paint mit Button Clear den Hintergrund säubern um wieder zeichnen zu können AWT, Swing, JavaFX & SWT 2
K 2D-Grafik Paint - Wie binde ich repaint ein? AWT, Swing, JavaFX & SWT 8
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
S paint() verzögern AWT, Swing, JavaFX & SWT 9
K AWT begrenzte anzahl paint aufrufe AWT, Swing, JavaFX & SWT 6
B Infolabel Probleme mit Paint() ? AWT, Swing, JavaFX & SWT 8
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Furtano AWT paint braucht ein Graphics Objekt ? AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Hostkomponentengröße in paint AWT, Swing, JavaFX & SWT 2
L JFrame an Paint-Inhalt anpassen AWT, Swing, JavaFX & SWT 6
E Warum übermalt paint das ganze Fenster? AWT, Swing, JavaFX & SWT 15
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
H paint überlappend AWT, Swing, JavaFX & SWT 5
E paint AWT, Swing, JavaFX & SWT 3
H Swing paint() von JPanel wird nicht aufgerufen AWT, Swing, JavaFX & SWT 10
L AWT Paint(g) im Listener aufrufen AWT, Swing, JavaFX & SWT 2
S JCheckBox Paint AWT, Swing, JavaFX & SWT 7
F AWT Probleme mit der paint() methode AWT, Swing, JavaFX & SWT 2
C Unterschiedlicher Aufruf der paint() Methode ? (AWT/Swing) AWT, Swing, JavaFX & SWT 2
L Problem mit paint Methode und Bild AWT, Swing, JavaFX & SWT 7
F Swing Paint mit Canvas Element AWT, Swing, JavaFX & SWT 35
K AWT paint wird nicht aufgerufen AWT, Swing, JavaFX & SWT 7
R LayoutManager Image Paint + Text Panel AWT, Swing, JavaFX & SWT 10
F paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
S Threads in einen Frame zeichnen lassen (Paint()?!) AWT, Swing, JavaFX & SWT 5
radiac Swing JFrame - paint(g) - FrameObjects bei activeRendering AWT, Swing, JavaFX & SWT 3
I AWT paint() in MouseEvent aufrufen klappt nicht AWT, Swing, JavaFX & SWT 8
T paint() wird zweimal ausgeführt AWT, Swing, JavaFX & SWT 6
hdi Swing JLabel & paint-Methode gemixt - wie schlimm wirklich? AWT, Swing, JavaFX & SWT 5
N Paint methode anhalten und neustarten AWT, Swing, JavaFX & SWT 5
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
M AWT Component/Canvas erzeugt unerwünschten Rahmen bei paint AWT, Swing, JavaFX & SWT 3
T Dialog ohne Frame, direktes paint in graphics AWT, Swing, JavaFX & SWT 5
G Probleme mit repaint / paint AWT, Swing, JavaFX & SWT 6
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
K repaint() ruft paint() nicht auf AWT, Swing, JavaFX & SWT 14
J Canvas / paint() AWT, Swing, JavaFX & SWT 2
bugmenot paint() verzögert ausgeführt? AWT, Swing, JavaFX & SWT 4
S paint() in anderen Methoden AWT, Swing, JavaFX & SWT 5
J getFontMetrics außerhalb von paint(Graphics g) AWT, Swing, JavaFX & SWT 8
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
H paint verwenden AWT, Swing, JavaFX & SWT 3
S java.awt.Component und paint() AWT, Swing, JavaFX & SWT 4
A Paint funktioniert nicht richtig AWT, Swing, JavaFX & SWT 7
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
T Variable Menge an Bildern außerhalb paint() zeichnen? AWT, Swing, JavaFX & SWT 2
G Paint und Buttons AWT, Swing, JavaFX & SWT 8
G JFrame JPanel und Paint(Image)? AWT, Swing, JavaFX & SWT 6
S Programm aufgrund von paint() zu langsam AWT, Swing, JavaFX & SWT 18
G paint() wird aufgerufen, aber nicht angezeigt AWT, Swing, JavaFX & SWT 10
G 2x Graphics in einer paint() miteinander verbinden AWT, Swing, JavaFX & SWT 11
M Probleme mit paint() aus JFrame AWT, Swing, JavaFX & SWT 2
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
G Frage zum paint Prozess AWT, Swing, JavaFX & SWT 3
D JPanel und Paint AWT, Swing, JavaFX & SWT 2
B Gui und Zeichnen (paint ? ) AWT, Swing, JavaFX & SWT 4
L Anzeigen von fotos: ImageIcon oder BufferedImage + paint() ? AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben