2D-Grafik paint-Methode wird zu oft ausgeführt

krgewb

Top Contributor
Ich möchte zwei Bilder (AlbDonauKreis_t.png und BadenBaden_t.png) zeichnen.
In dem Code ist die Zeile
Java:
System.out.println("Huhu");
Anhand der Ausgabe erkenne ich, dass die paint-Methode viermal aufgerufen wird.
Ich habe bereits erfahren, dass man niemals etwas in die paint-Methode schreiben sollte. Ich weiß jedoch nicht, wie ich es sonst machen soll.

Java:
package de.uebung;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Hauptfenster extends JFrame {
    private static final long serialVersionUID = 1L;
    Container zeichenpane;
    Bildpanel bildpanel;

    public Hauptfenster() {

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);
        this.setTitle("BW");

        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setTitle("BW");
        this.setSize(650, 650);

        bildpanel = new Bildpanel(this);
        zeichenpane = this.getContentPane();
        zeichenpane.setLayout(new FlowLayout(FlowLayout.LEADING));
        zeichenpane.add(bildpanel);

        this.pack();
        this.setVisible(true);
    }

}

class Bildpanel extends JPanel {
    private static final long serialVersionUID = 1L;

    private Image bild01;
    private Image bild02;
    private int breite = 500;
    private int hoehe = 565;

    private String trenner = System.getProperty("file.separator");

    private String pfad = "";
    private String dateiname01 = "";
    private String dateiname02 = "";

    private Hauptfenster haupt;

    public Bildpanel(Hauptfenster haupt) {
        this.haupt = haupt;
        this.setPreferredSize(new Dimension(500, 565));

        pfad += this.getClass().getClassLoader().getResource("").getPath();
        pfad += trenner + "de" + trenner + "weingartenvideos" + trenner + "bilder" + trenner;

        dateiname01 = pfad + "AlbDonauKreis_t.png";

        System.out.println(dateiname01);

        if (dateiname01.length() != 0) {

            // Imageobjekt erzeugen
            bild01 = this.getToolkit().getImage(dateiname01);

            // Ladevorgang starten
            boolean prepared = this.prepareImage(bild01, this);

            if (prepared == true)
                System.out.println("Bild01 fertig");
            else
                System.out.println("Bild01 nicht fertig");
        }

        dateiname02 = pfad + "BadenBaden_t.png";

        if (dateiname02.length() != 0) {
            bild02 = this.getToolkit().getImage(dateiname02);
            boolean prepared = this.prepareImage(bild02, this);

            if (prepared == true)
                System.out.println("Bild02 fertig");
            else
                System.out.println("Bild02 nicht fertig");
        }

    }

    // Zeichnen der Bilder
    @Override
    public void paint(Graphics g) {

        // Konvertierung Garphicsobjekt nach Java2D
        Graphics2D g2d = (Graphics2D) g;

        System.out.println("Huhu");

        // Bild nur zeichnen, wenn eine Bilddatei angegeben ist
        if (dateiname01.length() != 0) {

            try {
                // warten, sonst wird ERROR nicht korrekt erkannt
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // Bild zeichnen
            g2d.drawImage(bild01, 0, 0, breite, hoehe, this);
        } else {
            System.out.println("Leerer Dateiname");
        }

        if (dateiname02.length() != 0) {

            try {
                // warten, sonst wird ERROR nicht korrekt erkannt
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            // Bild zeichnen
            g2d.drawImage(bild02, 0, 0, breite, hoehe, this);
        }

        haupt.pack();

    }

}

class Hauptprogramm {

    public static void main(String[] args) {
        Hauptfenster haupt = new Hauptfenster();
        haupt.bildpanel.repaint();
    }

}
 
Zuletzt bearbeitet:

krgewb

Top Contributor
Was soll denn passieren bzw. was ist dein Problem damit?
Wenn ich es nun erweitere und 40 Bilder reintue kommt es zu einer Exception
Code:
Exception in thread "Image Fetcher 3" java.lang.OutOfMemoryError: Java heap space
    at java.awt.image.DataBufferInt.<init>(Unknown Source)
    at java.awt.image.Raster.createPackedRaster(Unknown Source)
    at java.awt.image.DirectColorModel.createCompatibleWritableRaster(Unknown Source)
    at sun.awt.image.ImageRepresentation.createBufferedImage(Unknown Source)
    at sun.awt.image.ImageRepresentation.setPixels(Unknown Source)
    at sun.awt.image.ImageDecoder.setPixels(Unknown Source)
    at sun.awt.image.PNGImageDecoder.sendPixels(Unknown Source)
    at sun.awt.image.PNGImageDecoder.produceImage(Unknown Source)
    at sun.awt.image.InputStreamImageSource.doFetch(Unknown Source)
    at sun.awt.image.ImageFetcher.fetchloop(Unknown Source)
    at sun.awt.image.ImageFetcher.run(Unknown Source)
 

JCODA

Top Contributor
1) Erbe nicht von JFrame
2) Erbe von JPanel oder JComponent, überschreibe die paintComponent(Graphics g)-Methode. (und rufe die paintComponenet(g) von der super-Klasse als erstes auf...)
3) Lade deine Bilder nicht mit Toolkit, sondern mit ImageIO: https://docs.oracle.com/javase/8/docs/api/javax/imageio/ImageIO.html
4) Schreibe niemals Thread.sleep in die paint-Methoden!
5) Schreibe sonst keine Logik in paintMethoden.
6) dateiname01.length() != 0 ist unnötig, wenn der Code dateiname01 = pfad + "AlbDonauKreis_t.png"; darübersteht.
(Dort wird String-Länge geprüft ~ NICHT Dateigröße oder soetwas.)
 
Zuletzt bearbeitet:

krgewb

Top Contributor
Danke! Ich habe es nun mit ImageIO gemacht. Die PNG-Dateien werden jedoch nicht angezeigt. Bei BMP- und JPG-Dateien funktioniert es problemlos. Ich brauche aber PNG wegen der Transparenz.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
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
A paint-Methode aufrufen AWT, Swing, JavaFX & SWT 13
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
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 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
I Paint-Methode von nicht statischen Objekten aufrufen AWT, Swing, JavaFX & SWT 3
D JSlider "laggt" nach überschreiben der paint methode AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
J AWT Methode paint() AWT, Swing, JavaFX & SWT 4
X Bild via FileChooser in paint-Methode laden AWT, Swing, JavaFX & SWT 2
G paint-Methode kopiert GUI AWT, Swing, JavaFX & SWT 14
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 paint-Methode des JComboboxEditorComponent AWT, Swing, JavaFX & SWT 2
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
R [gelöst]Fenster schließen - trotz Endlosschleife in der Paint-Methode? AWT, Swing, JavaFX & SWT 3
M Allgemeines zur paint Methode AWT, Swing, JavaFX & SWT 5
A paint()-Methode für Videoexport nutzen AWT, Swing, JavaFX & SWT 2
D Paint() Methode aus einer anderen Klasse aufrufen AWT, Swing, JavaFX & SWT 6
L Dynamisches Ändern der Größe in JPanel mit paint()-Methode AWT, Swing, JavaFX & SWT 8
C paint-Methode überschreiben AWT, Swing, JavaFX & SWT 19
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
G paint() Methode aus anderer klasse aufrufen? AWT, Swing, JavaFX & SWT 6
G Frage zur paint-Methode (AWT) AWT, Swing, JavaFX & SWT 9
N paint Methode im JFrame AWT, Swing, JavaFX & SWT 3
T Paint-Methode geht nicht AWT, Swing, JavaFX & SWT 5
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
B paint methode wiederholen AWT, Swing, JavaFX & SWT 6
G Problem mit paint Methode und Buttons AWT, Swing, JavaFX & SWT 10
T JPanel - paint Methode?, aber wie AWT, Swing, JavaFX & SWT 13
K paint-Methode überschrieben - trotzdem JComponenten zeichnen AWT, Swing, JavaFX & SWT 5
bummerland paint Methode AWT, Swing, JavaFX & SWT 2
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
U Was ist der Unterschied von paint und paincomponent? AWT, Swing, JavaFX & SWT 3
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
H Swing + Paint: Mehrere Objekte zeichnen lassen AWT, Swing, JavaFX & SWT 3
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 2 Paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
P Paint und paintComponent AWT, Swing, JavaFX & SWT 12
S 2 paint-Methoden in einer Klasse ? AWT, Swing, JavaFX & SWT 2
C JFrame paint ohne hintergrund nutzen AWT, Swing, JavaFX & SWT 6
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
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
L Swing 64bit Problem mit paint/paintComponent AWT, Swing, JavaFX & SWT 7
T JFrame und paint() AWT, Swing, JavaFX & SWT 5
B Ablauf der paint-Methoden von JComponents AWT, Swing, JavaFX & SWT 20
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
T paint() wird nicht aufgerufen AWT, Swing, JavaFX & SWT 8
M JMenuBar im Applet und paint AWT, Swing, JavaFX & SWT 9
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 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
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
H AWT Wann ist paint() fertig? AWT, Swing, JavaFX & SWT 7
W Steuerelemente und paint() in einem JPanel AWT, Swing, JavaFX & SWT 3
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
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
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
G JScrollPane mit "paint" scrollt nicht AWT, Swing, JavaFX & SWT 2
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

Ähnliche Java Themen

Neue Themen


Oben