Frage zur paint-Methode (AWT)

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo, ich habe eine Übungsaufgabe aus einem Buch (Java für Studenten) versucht zu lösen.
Aufgabe war, dass eine symbolische Schildkröte einen Stift auf dem Bauch hat und man via Button,
das Teil bewegen kann. Warum werden aber alle gezeichneten Linien wieder 'gelöscht' wenn das nächste
mal paint aufgerufen wird? Vielen Dank vorab. Wenn es andere Hinweise oder Verbesserungen gibt,
dann bin ich auch da nicht abgeneigt.

Denke, dass ich das auch fast hin bekommen habe, aber waru

Code:
import java.applet.Applet;
import java.awt.Button;
import java.awt.Graphics;
import java.awt.Scrollbar;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.AdjustmentEvent;
import java.awt.event.AdjustmentListener;


public class Schildkroete extends Applet implements AdjustmentListener, ActionListener{

	
	private Scrollbar schieber;
	private int schiebewert;
	private int startX = 100;
	private int startY = 100;
	private int endeX = 100;
	private int endeY = 100;
	private int status = 1;
	
	private Button stifthoch, stiftrunter, links90, rechts90, nPixelVorwaertsGehen;
	public void init(){
		
		setSize(500, 500);
		schieber = new Scrollbar(Scrollbar.HORIZONTAL, 0,1,0,100);
		add(schieber);
		schieber.addAdjustmentListener(this);
		stifthoch = new Button("Stift hoch");
		add(stifthoch);
		stifthoch.addActionListener(this);
		stiftrunter = new Button("Stift runter");
		add(stiftrunter);
		stiftrunter.addActionListener(this);
		links90 = new Button("90 Grad links");
		add(links90);
		links90.addActionListener(this);
		rechts90 = new Button("90 Grad rechts");
		add(rechts90);
		rechts90.addActionListener(this);
		nPixelVorwaertsGehen = new Button("n Pixel vorwärts");
		add(nPixelVorwaertsGehen);
		nPixelVorwaertsGehen.addActionListener(this);
		
		
	}

	public void adjustmentValueChanged(AdjustmentEvent e) {
		
		schiebewert = schieber.getValue();
		
		// TODO Auto-generated method stub
		
	}
	
	public void paint (Graphics g){
		System.out.println("Ergebnis startx + schiebwert: " + (startX + schiebewert));
		System.out.println("Schiebewert: " + schiebewert);
		System.out.println("startX: " + startX);
		System.out.println("startY: " + startY);
		System.out.println("endeX: " + endeX);
		System.out.println("endY: " + endeY);
		g.drawLine(startX, startY, endeX, endeY );
		g.drawString(String.valueOf(schiebewert) , 50, 100);
			
			
			
			
			startY = endeY;
			startX = endeX;
		}
	

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == stifthoch)
		{
			endeY = startY - schiebewert;
			status = 2;
		}
						
			
		if (e.getSource() == stiftrunter)
			{
			 endeY = startY + schiebewert;
			 status = 4;
			}
		
		
		if (e.getSource() == links90)
		{
			switch (status)
			{
			
			case 1: endeY = startY - schiebewert; status = 2; break;
			case 2: endeX = startX - schiebewert; status = 3; break;
			case 3: endeY = startY + schiebewert; status = 4; break;
			case 4: endeX = startX + schiebewert; status = 1; break;
				
			}
		}
		if (e.getSource() == rechts90)
		{
			switch (status)
			{
			
			case 3: endeY = startY - schiebewert; status = 2; break;
			case 4: endeX = startX - schiebewert; status = 3; break;
			case 1: endeY = startY + schiebewert; status = 4; break; 
			case 2: endeX = startX + schiebewert; status = 1; break;
				
			}
		}
		if (e.getSource() == nPixelVorwaertsGehen)
		{
			
			
			System.out.println("endeX ist vor der Zuweisung: " + endeX);
			System.out.println("schiebewert ist: " + schiebewert);
			System.out.println("ok, hier nochmal: endeX ist hier: " + endeX);
			
			switch (status)
			{
			
			case 2: endeY = startY - schiebewert; status = 2; break;
			case 3: endeX = startX - schiebewert; status = 3; break;
			case 4: endeY = startY + schiebewert; status = 4; break;
			case 1: endeX = startX + schiebewert; status = 1; break;
				
			}
			repaint();
			}
		
		
					
	}
}
 
Anonymous hat gesagt.:
Warum werden aber alle gezeichneten Linien wieder 'gelöscht' wenn das nächste
mal paint aufgerufen wird?

Weil dies das Grundprinzip sämtlicher GUI-Anwendungen auf Multi-Task-Systemen ist.

Die paint-Methode muß immer alles zeichnen, da es ja sein kann, daß
deine Anwendung kurzfristig von einer anderen verdeckt wird und nicht immer
im Vordergrund ist.

Lösung ist nicht direkt zu zeichnen, sondern die Informationen,
die das zu zeichnende definieren, in einer Collection (ArrayList, ...)
zu speichern und repaint() aufzurufen, sodaß paint() dann immer alle
bisher aufgelaufenen Zeichnen-Operationen ausführt.
 
Ich weiß nicht, ob es elegant ist; ich hab es mal folgendermaßen gemacht:

Code:
public void update (Graphics g){
       paint(g);    
}

Füge einfach die update-Methode hinzu, obwohl es wohl besser wäre alle Elemente in einem Array zu speichern, da sonst z.B. beim Minimieren wieder alle Elemente von dem Canvas verschwunden sind.

Gruß Marcel
 
Marcel_Handball hat gesagt.:
Ich weiß nicht, ob es elegant ist; ich hab es mal folgendermaßen gemacht:
...
Füge einfach die update-Methode hinzu.

??? :shock: :autsch: :shock:

Wohl nicht dein Tag heute, Marcel? 😎 :bae:
 
Danke für die prompte Hilfe an alle. Mit update funktioniert es. Denke aber darüber nach, dass ggf. mal über ein Array zu versuchen. Was speichere ich dann eigentlich in dem Array? Koordinaten sind es ja nicht? Objekte? Ihr seht, ich stehe da noch ziemlich auf dem Schlauch.

Meint ihr, es wäre gut mit AWT anzufangen oder gleich auf Swing zu setzen.

Danke und Gruß. funnybones

PS: vorhin war ich wohl nicht eingeloggt, daher als Gast die Frage gestellt.
 
Das gehört aber wahrscheinlich nicht in paint, sonst zeigt paint ja beim nächsten Mal was anderes (z.B. wenn du minimierst/maximierst), ohne daß eine Aktion stattgefunden hat.
 
Wo wäre es Deiner Meinung nach günstiger, wenn nicht in paint()?

In der ActionPerformed-Methode vor den ganzen if-Abfragen?

Danke und Gruß. funnybones
 
Ja, das ist gut.

EDIT:
Für diese Übung kannste ruhig bei AWT bleiben, denk ich mal, die Gui is ja net die Hauptsach.
Im Array kannste Objekte speichern die jeweils alle Infos zu einer Teillinie speichern.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben