repaint() wird nicht ausgeführt

Marcel_Handball

Bekanntes Mitglied
Hi,

ich versuche eine kleine Animation zu erstellen und habe zum Testen ein bewegendes Rechteck implementiert.
Allerdings wird die paint Methode durch den repaint() Aufruf nicht ausgeführt.
Von außen ruft ein Thread immer die Methode move() aus der folgenden Klasse auf.

Hier einmal die Klasse.

Java:
public class IntroPanel extends JPanel{

	private final MainFrame mainFrame;
	private int x, y;
	private int width, height;
	private boolean right = true;
	
	
	public IntroPanel(MainFrame mainFrame) {
		this.mainFrame = mainFrame;
		Settings s = new Settings(SessionTyp.Single, GameType.Classic, false, false, false, false);
		
		width = 100;
		height = 100;
		y = 10;
		//Game g = new Game(s, mainFrame);
	}
	
	
	public void move(){
		
		if(right){
			//System.out.println(getHeight());
			if((x+width) < 500){
				x++;
			}
			else{
				right = false;
			}
		}
		else{
			if(x > 0){
				x--;
			}
			else{
				right = true;
			}
		}
		
		repaint();
	}
	
	
	
	@Override
	public void paintComponent(Graphics g) {
		
		//Graphics2D g = (Graphics2D) arg;
		System.out.println("Paint");
		g.fillRect(x, y, width, height);
	}
	
	

}

Woran könnte es liegen, dass er nichts neu zeichnet?
 
> Von außen ruft ein Thread immer die Methode move() aus der folgenden Klasse auf.

zeig das doch auch alles, vielleicht wird move() an einem anderen Objekt als in der GUI zu sehen aufgerufen,
das bringt dann wenig

erste Zeile in paintComponent sollte immer
super.paintComponent(g);
sein, um vorheriges zu löschen usw.
 
Der Aufruf der move-Methode sieht so aus:

Java:
public class SessionPanel extends JPanel{

	private Thread t;
	private IntroPanel dummy;

	
	public SessionPanel() {

		initComponents();
		
		t = new Thread(){
			@Override
			public void run() {
				
				while(true){
					dummy.move();
					try {
						Thread.sleep(100);
					} 
					catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		};
		
		t.start();	
}



Ich bekomme ein stehendes Rechteck am linken Rand des (Intro)Panels gezeichnet.
 
Zuletzt bearbeitet:
nicht genug, aber bringt mich zumindest auf eine neue Fehleridee,
das Panel könnte zu klein sein um überhaupt etwas zu sehen,

schau dir mein funktionierendes Testprogramm weitgehend mit deinem Code bis auf die Stellen, die du dir immer noch sparst zu posten,
besonders die beiden mit Kommentar markierten Codezeilen

edit:
> Ich bekomme ein stehendes Rechteck am linken Rand des (Intro)Panels gezeichnet.
dann liegt es an meiner neuesten Idee vielleicht doch nicht

Java:
public class TestGUI
    extends JFrame
{
    public TestGUI()
    {
        add(new SessionPanel());
        setSize(300, 300);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args)
    {
        new TestGUI();
    }
}


class SessionPanel
    extends JPanel
{

    private Thread t;
    private IntroPanel dummy;


    public SessionPanel()
    {

        initComponents();

        t = new Thread()
            {
                @Override
                public void run()
                {

                    while (true)
                    {
                        dummy.move();
                        try
                        {
                            Thread.sleep(100);
                        }
                        catch (InterruptedException e)
                        {
                            e.printStackTrace();
                        }
                    }
                }
            };

        t.start();
    }

    private void initComponents()
    {
        dummy = new IntroPanel();
        dummy.setPreferredSize(new Dimension(200, 200)); // interessant
        dummy.setBorder(BorderFactory.createLineBorder(Color.GREEN)); // interessant
        add(dummy);
    }
}


class IntroPanel
    extends JPanel
{

    private int x, y;
    private int width, height;
    private boolean right = true;


    public IntroPanel()
    {

        width = 100;
        height = 100;
        y = 10;
        // Game g = new Game(s, mainFrame);
    }


    public void move()
    {

        if (right)
        {
            // System.out.println(getHeight());
            if ((x + width) < 500)
            {
                x++;
            }
            else
            {
                right = false;
            }
        }
        else
        {
            if (x > 0)
            {
                x--;
            }
            else
            {
                right = true;
            }
        }

        repaint();
    }


    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        // Graphics2D g = (Graphics2D) arg;
        System.out.println("Paint");
        g.fillRect(x, y, width, height);
    }
}
 
der Fehler war das ich zum Anzeigen ein weiteres Objekt angelegt habe und somit nicht das dummy-Objekt angezeigt wurde auf dem gezeichnet wurde. 😳

trotzdem danke fürs Testen
 

Neue Themen


Zurück
Oben