Repaint() funktioniert im Zusammenhang mit einem MouseListener nicht

Witschi262

Grünschnabel
Hallo,
ich möchte einen einarmigen Banditen programmieren und habe bereits einen kleinen Grundstein gelegt, der momentan so aussieht:

Code:
import java.awt.*;
import java.awt.event.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;
import javax.swing.*;
public class BACKGROUND extends Canvas
{

    ImageIcon img_bg = new ImageIcon("j:\\Einarmiger Bandito\\background.jpg");
    ImageIcon img_but = new ImageIcon("j:\\Einarmiger Bandito\\button_start.png");
    JLabel img_bg_label;
    JLabel img_but_label;
    JLayeredPane jlp = new JLayeredPane();

    protected boolean player_has_start = false;

    BACKGROUND() {
        img_bg_label = new JLabel(img_bg); 
        img_but_label = new JLabel(img_but);

        img_bg_label.setBounds(0,0,320,480);
        img_bg_label.setOpaque(true);

        img_but_label.setBounds(240,200,54,54);
        img_but_label.setVisible(true);

        jlp.add(img_bg_label, 1);
        jlp.add(img_but_label, 0);

        img_but_label.addMouseListener(new MouseAdapter() {      
                public void mousePressed(MouseEvent e) { 
                    MoveButton();
                } 
            }); 
    }
    
    public void MoveButton()
    {
        for(int i = 0; i <= 150; i++)
        {
            System.out.println("METHODE MOVE BUTTON()!"); 
            img_but_label.setBounds(240,i+200,54,54);
            repaint();

            if(i == 150)
            {
                for(int j = 0; j <= 150; j++)
                {
                    img_but_label.setBounds(240,350-j,54,54);
                   
                    repaint();
                    try {
                        Thread.sleep(5);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }   
                }
            }
            try {
                Thread.sleep(5);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }           
        }

    }
}

Bisher habe ich also nur eine grafische Oberfläche und einen darauf sich befindenden Knopf realisiert. Ebenfalls habe ich die Methode MoveButton() geschrieben, die bei direktem Aufruf den Button entsprechend verschiebt.

Wenn ich allerdings das MausEvent aufrufe kommt zwar 150 mal "METHODE MOVE BUTTON()!" im Konsolenfenster, allerdings wird das die Grafik nicht verschoben - warscheinlich wegen dem repaint().

Wo liegt der Fehler? Wenn ich die Methode direkt aufrufe funktioniert es ja einwandfrei und die Methode wird ja auch beim Mausklick aufgerufen.

Gruß,
Lucas
 

HonniCilest

Erfahrenes Mitglied
Hallo,

hierzu gibt es unzählige Erklärungen im Netz. Informiere dich mal über Stichworte wie EDT (Event Dispatch Thread). Deine Komponente wird neu gezeichnet, allerdings erst am Ende. An dieser Stelle hast du allerdings bereits wieder die Originalposition erreicht, wodurch du keine Veränderung wahrnimmst. Ich habe selten gute Erfahrungen mit Thread.sleep() gemacht. Wenn du periodisch etwas wiederholen möchtest rate ich dir zu einem entsprechenden Timer.

Gruß
HC
 

Neue Beiträge