# Repaint Problem



## fh-Frankfurt (2. Feb 2009)

Hi alle zusammen. Ich muss für das 3. Semester ein Spiel programmieren. Das Spiel heisst Set! Und dabei hab ich folgendes Problem(es wäre unangebracht mein Programm hier zu posten, da dies zu Unübersichtlichkeit führt.Daher hab ich ein Miniprogramm geschrieben, damit ich mein Problem besser schildern kann):
Das Miniprogramm besteht aus 3 Klassen: Hauptfenster (zur Darstellung eines Tisches), Main, und Bild(zum Zeichnen einer Karte)

```
//---------------------------------------------------------------------------------HauptFenster
package test;
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
import java.awt.event.*;

public class HauptFenster extends JFrame implements ActionListener{

	//Buttons anlegen
	JButton buttonOval = new JButton("Oval");
	JButton buttonRechteck = new JButton("Rechteck");
	JPanel pMitte = new JPanel();
	Bild bild;

	public HauptFenster()
	{
		super();
		this.setTitle("Test");
		this.setLayout(null);
		Container spielTisch=getContentPane();;

		//2 Buttons erzeugen und zum Fenster adden
		buttonOval.setBounds(new Rectangle(230, 250, 110, 25));
		buttonRechteck.setBounds(new Rectangle(430, 250, 110, 25));
		this.getContentPane().add(buttonRechteck, null);
		this.getContentPane().add(buttonOval, null);
		//Mittleren Panel positionieren und zum spielTisch adden
		pMitte.setBounds(200,20,200,110);
		pMitte.setLayout(null);
		this.add(pMitte);

		//Macht das Fenster zu
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

	// Ereignisbehandlung
	public void actionPerformed(ActionEvent e)  {

		String label = e.getActionCommand();

		if(label.equals("Oval"))//Falls man Button Oval drückt
		{
			bild=new Bild(1);
			bild.repaint();
			pMitte.add(bild);
		}
		else if(label.equals("Rechteck"))//Falls man Button rechteck drückt
		{
		bild=new Bild(2);
		bild.repaint();
		pMitte.add(bild);
		}

	}//actionPerformed
}

//--------------------------------------------------------------------------------------------Main
package test;
public class Main {

	public Main() {
		HauptFenster fenster = new HauptFenster();
		fenster.setSize(600, 400);
		fenster.setVisible(true);
	}//Konstruktor

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

//----------------------------------------------------------------------------------------------Bild
package test;
import javax.swing.*;
import java.awt.*;

public class Bild extends JPanel{
	int figura;
	public Bild(int figur)
	{   
		figura=figur;
		this.setBackground(Color.green);
		this.setBounds(0,0,90,110);
	}//Ende vom Konstruktor
	
	//Funktion für das Zeichnen der Karte
	public void paintComponent(Graphics g){				
		super.paintComponent(g);
		Graphics2D g2d=(Graphics2D)g;
		g2d.setColor(Color.red);
		
		if(figura==1)//Malt das Oval
		g2d.drawOval(getWidth()/2-50/2, getHeight()/2-20/2, 50, 20);
		else if(figura==2)//Malt den Rechteck
		g2d.drawRect(getWidth()/2-50/2, getHeight()/2-16/2, 50, 16);
			
	}
}
```

Das Programm zeigt 2 button an. Ich möchte folgendes: Wenn man auf das Button "Ova"l klickt, dann soll das programm ein Oval zeichnen, dasselbe gilt für Button Rechteck. D.h jedes mal wenn ich auf ein Button klicke, dann soll das Programm immer wieder neuzeichnen.In der *Zeile 46, 52* hab ich die repaint()-funktion aufgerufen... aber es funktioniert irgendwie nicht.. kann mir bitte bitte jemanden helfen?


----------



## fh-Frankfurt (2. Feb 2009)

In dem Programm hab ich Bild vom JPanel abgeleitet und Bild wird wiederum in einem Panel (pMitte)eingefügt und pMitte wird dann schließlich in das Fenster eingefügt.


----------



## SlaterB (2. Feb 2009)

die Buttons haben gar keinen ActionListener,
versuche doch bitte minimal Probleme selber zu debuggen, z.B. durch sowas simples wie
System.out.println("Button wurde gedrückt");
im ActionListener

keine Ausgabe -> da scheitert schon recht früh was unabhängig von allen Graphik-Problemen

------

bild.repaint() brauchst du nicht, 
viel wichtiger ist beim null-Layout, dass du pMitte.repaint() aufrufst wenn du in pMitte eine neue Komponente einfügst
(dann wird auch bild repainted)

-------

und mehrmals Bilder an die gleiche Stelle von pMitte einfügen wird nicht sonderlich hübsch enden bzw. es ist immer nur eines zu sehen,
verwende gleich 
pMitte.removeAll();
um alte Bilder wieder zu löschen

schöner wäre, nur ein Bild zu haben und darin die Zahl 1 oder2  zu ändern und dann wirklich am Bild repaint() aufzurufen


----------



## fh-Frankfurt (2. Feb 2009)

Vielen Dank Slaterb für deine schnelle Antwort^^.

Jo ich hatte  es übersehen den Button mit ActionListener zu posten. Ist wohl beim Kopieren/Einfügen passiert...

Nachtrag im Konstruktor von HauptFenster:


```
buttonOval.addActionListener(this);
	 buttonRechteck.addActionListener(this);
```

Jo deine Lösung mit removeAll() und hat mir geholfen und vielen dank noch ma für den tipp mit pMitte.repaint().


----------



## Gast (11. Feb 2009)

hi

Ich muss das selbe Programm ebenfalls schreiben. Habs eigentlich auch schon fertig, jedoch weiss ich nicht, wie ich die Welle hinbekomme
Hab solange ne andere form genommen. Würde jedoch gerne die Welle als Symbol benutzen, vorallem weil es eine Vorgabe vom Prof is.



so sollte das aussehn.


----------



## SlaterB (11. Feb 2009)

~


----------



## Steev (12. Feb 2009)

Zu der Welle:

Wieso nimmst du nicht einfach ein Bild?
Wenn diese Welle dynamisch gezeichnet werden soll, dann würde ich zum Beipiel einen GeneralPath oder etwas in der Richtung dazu benutzen.


----------

