Bild verschwindet nach kurzer Zeit in JPanel

JustinSane

Grünschnabel
Hallo!

hab jetzt schon länger in Foren, tutorials, oracle usw gesucht, aber leider zu meinem Problem keine wirkliche Lösung gefunden.

Es geht grundsätzlich darum, dass ich ein Panel habe, dass sich aus 2 weiteren Panels zusammen setzt (alles Swing-Komponenten). Im oberen Panel werden meine Buttons dargestellt und im unteren soll ein Bild angezeigt werden. (soll ein einfaches Bildbearbeitungsprogramm werden)
Die App(Frame) soll dann aus diesem Panel bestehen und wenn ein Bild geöffnet wird, die Methode initImg(img) aufgerufen werden.
Das Problem ist nun jedoch das, dass mein Bild nur für einen Bruchteil einer Sekunde gemalen wird und dann sofort wieder verschwindet. Dabei habe ich meiner Meinung die paintComponents-Methode doch richtig überschrieben, oder?

Der Quellcode des Jpanels ist

Java:
public class ImageEditingPanel extends javax.swing.JPanel {
 
    private boolean pictureLoaded;
    private float displayedHeight;
    private float displayedWidth;
    private int horCenter;
    private int vertCenter;
    private float imgWidth;
    private float imgHeight;
    private Image img;
    private boolean crop;
    private Rectangle rect;
    private Image originalImg;
    private float[] displayedSizes = new float[2];
    private DisplayImage displayImg;
    private ObserveImageChanges changeObserver; //enthält undo/redo-Funktionen
    private ArrayList<Image> undo;
    private ArrayList<Image> redo;
    private boolean init;
 
    public ImageEditingPanel() {
        initComponents();
    }
 
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (!init) {
            initComponents();
            init = true;
        }
        if (pictureLoaded) {
            horCenter = editingPanel.getWidth() / 2 - (int) displayedWidth / 2;
            vertCenter = editingPanel.getHeight() / 2 - (int) displayedHeight / 2;
            g.drawImage(img, horCenter, vertCenter, (int) displayedWidth, (int) displayedHeight, this);
        }
        if (crop) {
            Graphics2D g2 = (Graphics2D) g;
            g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                    RenderingHints.VALUE_ANTIALIAS_ON);
            g2.setColor(Color.red);
            g2.setStroke(new BasicStroke(5));
            g2.draw(rect);
            CropImageShape cropImgShape = new CropImageShape(this);
            this.addMouseListener(cropImgShape);
            this.addMouseMotionListener(cropImgShape);
        }
    }
 
    public void initImage(Image img) {
        this.originalImg = img;
        this.img = originalImg;
        imgWidth = img.getWidth(this);
        imgHeight = img.getHeight(this);
        displayImg = new DisplayImage(img, editingPanel);
        displayedSizes = displayImg.resize2WindowHeight();
        displayedWidth = displayedSizes[0];
        displayedHeight = displayedSizes[1];
        changeObserver = new ObserveImageChanges(img);
        undo = changeObserver.getUndo();
        redo = changeObserver.getRedo();
        pictureLoaded = true;
        redrawImg(img);
    }
 
    public void redrawImg(Image img) {
        changeObserver.observeImageChanges(img);
        this.img = img;
        this.repaint();
    }
 
Zuletzt bearbeitet von einem Moderator:
Hi und willkommen bei tutorials.de,
in deinem Code kann ich weitestgehend keinen Fehler finden, der auf dein Problem zurückzuführen wäre. Kannst du bitte den Code posten, in dem du mit dieser Klasse kommunizierst?

Und verwende bitte die Java-Code Tags. Ein Beispiel hierfür findest du in meiner Signatur.

Gruß

Fabio
 
hallo!

und danke für die Hinweise! Werd ich das nächste mal beachten! :)

aber jetzt noch mal zu meinem Problem:
Hab grundsätzlich das Problem gelöst, auch wenn ich keine Ahnung habe, was und wieso falsch an meinem Code gewesen sein soll...

Aber hab dann das Image nicht mehr vom Typ Image verwendet sondern BufferedImage verwendet und auf einmal hat es funktioniert!
Hab dann versucht das Problem noch genauer zu identifizieren und das Programm auf den Konstruktor zu reduzieren, so dass von mir keine einzige Zeile Code ausgeführt wurde und Trotzdem wurde mir das JPanel (Buttons usw.) nicht gezeichnet (initComponents hab ich natürlich drinnen gelassen...). Glaube also das mir der GUI-Builder von Netbeans da irgendwas zusammengehaut hat!
Werd mir in Zukunft also genauer überlegen, ob ich die GUI nicht eher programmatisch erzeuge...
 

Neue Beiträge

Zurück