paintComponents Bild flippen

Spin

Top Contributor
Hallo 🙂

Ich habe eine einfach Frage.

Java:
  @Override
    public void paintComponent(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;


        if (flipImage) {
            image = libary.getImg("pic0.jpg");
            g2d.drawImage(image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
            repaint();
            System.out.println("Rückseite");
        } else {
           g2d.drawImage(image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
            System.out.println("Vorderseite");
            repaint();
        }   
    }

Ich möchte gerne ein Bild flippen bzw. swappen lassen. Bei jedem Mausklick soll also die Rückseite angezeigt werden.
Ich wollte meine Bilder nicht in ein JLabel packen sondern auf ein Panel Zeichnen. Das habe ich jetzt auch gemacht. Es geht leider nicht. Die Bilder werden angezeigt und die paintComponents ruft sich auch auf, aber ich bekomme dass Bild nicht geflippt.

Habe es mit validate() und repaint() versucht, aber es zeichnet sich nichts neu, nachdem ich mein Mausklick abgefeuert habe.

Meine Frage ist einfach, wie kann ich außerhalb von paintComponents, die aktuelle Zeichnung des Bildes auf ein JPanel entfernen und dafür ein anderes zeichnen lassen? Danke für die freundliche Unterstützung 🙂
 
"Ist P==NP?" ist auch eine einfache Frage 😉

Ist es jetzt so, dass "image" am Anfang die Vorderseite zeigt, und irgendwann "flipImage" auf true gesetzt wird, und dann das NEUE "image = libary.getImg("pic0.jpg");" geladen wird, das die Rückseite zeigt? Dann sollte das eigentlich so weit funktionieren...

(BTW: In der paintComponent "repaint" aufzurufen ist GANZ böse: Damit schickt man ihn in eine ""Endlosschleife"" des Zeichnens....)

Poste ggf. mal mehr code.
 
Meine Frage ist einfach, wie kann ich außerhalb von paintComponents, die aktuelle Zeichnung des Bildes auf ein JPanel entfernen und dafür ein anderes zeichnen lassen?

Den repaint-Aufruf musst du an der Stelle machen, wo du eben den Mausklicks abfängst, bzw. dort wo du flipImage umdrehst..dort rufst du dann auf dem Panel repaint() auf!
Das "Entfernen" würde automatisch passieren wenn du super.paintComponent(g); aufrufen würdest...
 
Java:
public class MemoryCards extends JPanel{

    private BufferedImage back_image;
    private BufferedImage front_image;
    ImageLibary libary = ImageLibary.getInstance();
    private final int CARD_WIDTH = 200;
    private final int CARD_HEIGHT = 300;
    private boolean flipImage;

    public MemoryCards() {}

    public MemoryCards(String front_pic) {
        this.front_image = libary.getImg(front_pic);
        this.back_image  = libary.getImg("pic0.jpg");
        this.addMouseListener(new EventHandler());
    }

   public void setFlipImage(boolean flipImage) {
        this.flipImage = flipImage;
        
    }

   public boolean isFlipImage() {
        return flipImage;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        System.out.println(isFlipImage());
        Graphics2D g2d = (Graphics2D) g;
        if (isFlipImage()) {
            
            g2d.drawImage(back_image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
            System.out.println("Rückseite");
            validate();
            
        }
        else{
            g2d.drawImage(front_image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
            System.out.println("Vorderseite");
            validate();
        }
         
    }
    
}


Hier ich poste auch gerne den ganzen Code. Aber es will gerade garnichts mehr, Denke dass ich einfach mal ne Pause brauche 😉

Im EventHandler =

Java:
 public void mouseClicked(MouseEvent e) {
        mem.setFlipImage(true);
        mem.repaint();
    }


Villeicht findet ja jemand den logischen Fehler. Obwohl es eher an meinen Javakenntnissen liegen muss. Das Panel wird ständig gezeichnet. Also zumindest die Methode paintCompnent macht in der Konsole Alarm.

Irgendwie wir mein boolean nie auf true gesetzt obwohl ich es übergebe. Dass will ich nicht verstehen , danke für hilfe.
 
Mach mal ein KSKB...
Java:
 this.addMouseListener(new EventHandler());
+
Java:
public void mouseClicked(MouseEvent e) {
        mem.setFlipImage(true);
        mem.repaint();
    }

ist zumindest schon mal seltsam...Wo kommt dort das "mem" auf einmal her?
 
Uha 🙂
Also da gibts so einiges... (deprecated Methoden raus usw...)

Aber um jetzt nochmal zu deinem Flip zurückzukommen, es ist genau das was ich schon oben ansprach..
EventHandler :
Java:
 MemoryCards mem = new MemoryCards();

ist natürlich quatsch..du willst ja flipImage auf dem Panel aufrufen auf welches du geklickt hast !
D.h. schmeisse diese Zeile raus und in der mouseClicked dann so etwas wie:
Java:
    public void mouseClicked(MouseEvent e) {
    	MemoryCards mem = (MemoryCards) e.getSource();
        mem.flipImage();
    }

flipImage und paintComponent von MemoryCards dann natürlich wieder entsprechend anpassen
Java:
   public void flipImage(){
       this.flipped = true;
       this.repaint();
   }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;
        if (flipped) {
            g2d.drawImage(back_image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
        }
        else{
            g2d.drawImage(front_image, 0, 0, CARD_WIDTH, CARD_HEIGHT, null);
        } 
    }

p.s.: In der Memory-Klasse beim introPanel hast du den falschen super-Aufruf getätigt *g* (ohne das s hinten!!!)
 
Eraaaaaaaa,

vielen Dank. Das neue Objekt war mist.

danke dir.
Es geht noch nicht alles , aber jetzt kann ich eiter machen.
 

Zurück
Oben