AWT Auto aus einer anderen Klasse her neu zeichnen

alexj.

Mitglied
Wir machen in der Schule Java und ich wollte an unserem Auto-Projekt weiterarbeiten und eine Steuerung hinzufügen doch ich habe jetzt schon Probleme und zwar ich fang eine beliebige Taste ab um das Auto ein bisschen nach Rechts zu bewegen doch es funktioniert nicht es passiert einfach nichts. Das Auto soll sich bewegen bei einer beliebigen Tasten erstmal, danach würde ich alles andere machen. Hier ist mein Quellcode:

Tut mir leid für die Schreibweise wie ich programmiere aber ich bin nicht gerade der größte Profi in Java.

Haupt.java (Main Methode)
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;

public class Haupt extends Frame implements WindowListener
{
	//Frame erstellen mit dem Titel Auto
	private static Frame autoFrame = new Frame("Auto");
	
	//Größe des Fensters
	static final int H_SIZE = 800;
	static final int W_SIZE = 600;
	
	//Das/Die Auto(s)
	private static Auto car = new Auto();
	
	static ImageObserver myImageObserver;
	
	public Haupt()
	{
		autoFrame = this;
		autoFrame.setSize(H_SIZE, W_SIZE);
	    autoFrame.addWindowListener(this);
	    autoFrame.setLocation(50,50);
		//Fenster anzeigen:
		autoFrame.setVisible(true);
	}
	
	public void paint(Graphics g)
	{
		car.setg(g);
	    car.setRichtung(Auto.RECHTS);
	    car.setx(150);
	    car.sety(150);
	    car.setMyImageObserver(this);
	    car.zeichnen();
	}
	
	public static void main(String[] args) 
	{
		new Haupt();
		//AutoSteuerung starten um die Benutzer eingaben zu kontrollieren um das Auto zu steuern.
		new AutoSteuerung(autoFrame, car);
	}
	
	public void windowActivated(WindowEvent e){/*System.out.println("windowActivated");*/}
	public void windowIconified(WindowEvent e){/*System.out.println("windowIconified");*/}
	public void windowDeiconified(WindowEvent e){/*System.out.println("windowDeiconified");*/}
	public void windowDeactivated(WindowEvent e){/*System.out.println("windowDeactivated");*/}
	public void windowOpened(WindowEvent e){/*System.out.println("windowOpened");*/}
	public void windowClosing(WindowEvent e){/*System.out.println("windowClosing");*/ System.exit(0);}
	public void windowClosed(WindowEvent e){/*System.out.println("windowClosed");*/}
}

Auto.java
Java:
import java.awt.*;
import java.awt.image.*;


public class Auto 
{
	public int x;
	public int y;
	private int richtung;
	private Graphics g;
	  
	public static final int STOP   = 0;
	public static final int RECHTS = 1;
	public static final int LINKS  = 2;
	public static final int OBEN   = 3;
	public static final int UNTEN  = 4;

	Image wolke_links = Toolkit.getDefaultToolkit().getImage("C:\\rauchwolke_links.png");
	Image wolke_rechts = Toolkit.getDefaultToolkit().getImage("C:\\rauchwolke_rechts.png");
	ImageObserver myImageObserver;
	
	
	// Konstrukter Methoden
	public Auto() 
	{
	}
	public Auto(int r) 
	{
		this.setRichtung(r);
	}
	public Auto(int x, int y) 
	{
		this.setx(x);
		this.sety(y);
	}
	public Auto(int x, int y, int r) 
	{
		this.setx(x);
		this.sety(y);
		this.setRichtung(r);
	}
	
	  
	// Setter-Getter x,y
	public boolean setx(int wert) 
	{
		if (wert < 0) {return false;} 
		else {x = wert; return true;}
	}
	public boolean sety(int wert) 
	{
		if (wert < 0) {return false;} 
		else {y = wert; return true;}
	}
	public boolean setxy(int x, int y) 
	{
		if (!this.setx(x)) return false;
		if (!this.sety(y)) return false;
		zeichnen(); return true;
	}
	public int getx()
	{
	  return x;
	}
	public int gety()
	{
	  return y;
	}

	//Set Graphics - Zugriff auf Frame von Auto aus
	public void setg(Graphics g)
	{
	  this.g = g;
	}

	//Setter-Getter Auto Richtung
	public boolean setRichtung(int richtung) 
	{
		switch(richtung)
		{
			case 0: 										//STOP
			case 1: 										//RECHTS
			case 2: 										//LINKS
			case 3: 										//OBEN
			case 4: this.richtung = richtung; return true; 	//UNTEN
			default: return false; 							//Alles andere gibt es nicht
		}
	}
	public int getRichtung()
	{
		return richtung;
	}

	//Setter-Getter ImageObserver
	public void setMyImageObserver(ImageObserver io) 
	{
		this.myImageObserver = io;
	}
	public ImageObserver getMyImageObserver() 
	{
		return myImageObserver;
	}
	
	//Zeichnen vom Auto
	
	//Richtung
	public void zeichnen() {
		switch (richtung) 
		{
		case LINKS:
			this.zeichneLinks();
			break;
		case RECHTS:
			this.zeichneRechts();
			break;
		case OBEN:
			//this.zeichneoben();
			break;
		case UNTEN:
			//this.zeichneoben();
			break;
		}
	}
	//Zeichnen
	public void zeichneLinks() 
	{
		g.setColor(Color.BLACK);
		g.fillRect(x, y + 35, 120, 40);// Auto
		g.fillRect(x + 10, y + 20, 100, 20);// Auto

		g.setColor(Color.BLACK);
		g.fillOval(x + 10, y + 50, 30, 30);// Räder
		g.fillOval(x + 80, y + 50, 30, 30);// Räder

		g.setColor(Color.WHITE);
		g.fillOval(x + 13, y + 53, 24, 24);// Felge
		g.fillOval(x + 83, y + 53, 24, 24);// Felge

		g.setColor(Color.WHITE);
		g.fillRect(x + 12, y + 24, 54, 10);// Fenster
		g.fillRect(x + 68, y + 24, 36, 10);// Fenster

		g.setColor(Color.RED);
		g.fillRect(x + 110, y + 45, 10, 15);// Rückleuchte
		g.setColor(Color.YELLOW);
		g.fillRect(x + 1, y + 50, 10, 10);// Scheinwerfer

		this.g.drawImage(wolke_links, x + 117, y + 33, this.getMyImageObserver());
	}
	public void zeichneRechts() 
	{
		g.setColor(Color.BLACK);
		g.fillRect(x, y + 35, 120, 40);// Auto
		g.fillRect(x + 10, y + 20, 100, 20);// Auto

		g.setColor(Color.BLACK);
		g.fillOval(x + 10, y + 50, 30, 30);// Räder
		g.fillOval(x + 80, y + 50, 30, 30);// Räder

		g.setColor(Color.WHITE);
		g.fillOval(x + 13, y + 53, 24, 24);// Felge
		g.fillOval(x + 83, y + 53, 24, 24);// Felge

		g.setColor(Color.WHITE);
		g.fillRect(x + 50, y + 24, 54, 10);// Fenster
		g.fillRect(x + 12, y + 24, 36, 10);// Fenster

		g.setColor(Color.RED);
		g.fillRect(x + 1, y + 45, 10, 15);// Rückleuchte
		g.setColor(Color.YELLOW);
		g.fillRect(x + 110, y + 50, 10, 10);// Scheinwerfer

		this.g.drawImage(wolke_rechts, x - 50, y + 33, this.getMyImageObserver());
	}
	
}

und die Steuerung Klasse die Probleme macht:
AutoSteuerung.java
Java:
import java.awt.*;
import java.awt.event.*;
import java.awt.image.ImageObserver;

import javax.swing.JOptionPane;

public class AutoSteuerung implements KeyListener
{
	Frame f;
	Auto car;
	
	public AutoSteuerung(Frame f, Auto car)
	{
		this.f = f;
		f.addKeyListener(this);
		this.car = car;
	}

	public void keyPressed(KeyEvent e) {
		String s = "Taste gedrückt: Key = " + e.getKeyChar()
	            + " Code = " + e.getKeyCode();
		
	    car.setRichtung(Auto.LINKS);
	    car.setx(150);
	    car.sety(150);
	    car.setMyImageObserver(car.getMyImageObserver());
	    car.zeichnen();  
	    f.repaint();
	    //JOptionPane.showMessageDialog(null, s, "Test", JOptionPane.OK_CANCEL_OPTION);
	}
	public void keyReleased(KeyEvent e) {}
	public void keyTyped(KeyEvent e) {}
}
 

GUI-Programmer

Top Contributor
Funktioniert deine keyPressed auch? Schreib doch mal ein System.out.println("keyPressed"); rein. Denke nämlich, dass da noch ein Aufruf wie frame.setFocusable(true); und frame.requestFocus() vorher fehlt, damit der KeyListener übehaupt wirkt.

Und noch was: Anstatt von
Java:
public static void main(String[] args) 
    {
        new Haupt();
        //AutoSteuerung starten um die Benutzer eingaben zu kontrollieren um das Auto zu steuern.
        new AutoSteuerung(autoFrame, car);
    }
Schreib doch eher sowas:
Java:
public static void main(String[] args) 
    {
        new AutoSteuerung(new Haupt());
    }
und in AutoSteuerung (Konstruktor) steht dann sowas:
Java:
public AutoSteuerung(Haupt f)
    {
        this.f = f;
        f.addKeyListener(this);
        this.car = f.getCar();
    }
Wobei die Klasse Haupt natürlich dann noch die Methode getCar() enthalten muss.


P.S. Über deine Bezeichnungen und der alzuhäufigen Verwendung sag ich jetzt lieber mal nichts!!!
 

alexj.

Mitglied
Danke aber das ändert auch nichts habe die getCar Methode reingemacht aber hat nichts genützt. Ja es fängt die Eingaben ab habe ja diese MessageBox eingebaut um zu testen ob es die Eingaben abfängt und es funktioniert. Wenn ich eine beliebige Taste drücke dann zeichnet es auch irgendetwas aber halt nicht das was ich will das Auto bleibt auf der selben Stelle stehen.
 

GUI-Programmer

Top Contributor
Also bei Swing macht man das mit den Zeichnen überlicherweise so, dass nicht die paint() des JFrames überschrieben wird, sondern ein JPanel (oder Klasse die von JComponent erbt) dem JFrame hinzugefügt wird, und dessen paintComponent() überschrieben wird. Wahrscheinlich ist es bei AWT auch nicht viel anders.
Das heißt ich glaube du solltest mal ein Canvas deinem JFrame hinzufügen, und dessen paint() Methode überschreiben. Vielleicht funktionierts ja dann!

Falls es vielleicht dann doch an deiner generellen Vorgehensweise des Zeichnens liegt, also ein Graphics Objekt per set Methode zu übergeben, dann hilft vielleicht dass (meine .zip Datei), wobei du dann nur eine Figur hast, nämlich das Auto!!!
 

bERt0r

Top Contributor
Also ich würde das Graphics Objekt nicht per set Methode übergeben und in der Autoklasse halten. Mach doch einfach eine public void zeichne(Graphics g);

Zur Bewegung deines Autos:
Java:
 public void paint(Graphics g)
    {
        car.setg(g);
        car.setRichtung(Auto.RECHTS);
        car.setx(150);
        car.sety(150);
        car.setMyImageObserver(this);
        car.zeichnen();
    }
Solange hier fixe Werte drinstehen kann sich dein Auto gar nicht bewegen, du setzt die Werte ja immer auf 150 bei jedem repaint.
Deshalb: Lass deinen Keylistener nur setFunktionen auf dein Auto ausführen (x,y und Richtung), dann führe ein repaint auf deinem Frame aus. In deinem Frame kümmerst du dich NUR darum dein Auto so wie es ist zu Zeichnen am einfachsten über auto.zeichne(g).
 

alexj.

Mitglied
Also soll ich in Auto.java eine paint Methode erstellen und die von Haupt entfernen. Dann soll ich die x, y, Richtung werte in Auto definieren und damit zeichnen und wenn ich dann will das er sich bisschen nach rechts bewegt mache ich:

Java:
Auto car;
car.setx(car.getx + 10);

Wenn aber die paint Methode in Auto ist muss ich irgendwas oben noch definieren das sie funktioniert ?
Die repaint() Methode mache ich dann in der AutoSteuerung, nachdem ich die x und y werte verändert habe ?
 

bERt0r

Top Contributor
Du brauchst eine Sinnvolle Aufgabenverteilung:
Frame: Sorge dafür dass das Auto gezeichnet wird
Auto: Biete Funktionen an, mit denen man die Position des Autos ändern kann.
Biete eine Funktion an, mit der das Auto gezeichnet wird.

Wenn du jetzt in deiner Steuerung dein Auto bewegen willst sieht das so aus:
Java:
auto.setX(auto.getX()+10);
frame.repaint();

Was geschieht da? Du setzt zuerst die Position um, dann sagst du dem Frame, dass er neu gezeichnet werden soll. Also ruft der Frame die zeichneMich Funktion deines Autos auf, die zeichnet jetzt das auto auf der neuen Position.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
A SWT Auto completion in text box AWT, Swing, JavaFX & SWT 5
X Auto-Scroll versagt ab und zu -.- AWT, Swing, JavaFX & SWT 8
C Auto fahren - Rechteck JFrame AWT, Swing, JavaFX & SWT 6
_dp jTextArea/jTextPanel Auto Höhe AWT, Swing, JavaFX & SWT 5
Developer_X Swing Java JTextArea auto scroll down AWT, Swing, JavaFX & SWT 6
Daniel_L JTable, (Auto-)RowSorter und NullPointer-Exception AWT, Swing, JavaFX & SWT 6
B Auto. anpassen bei verschiedenen Aulösungen AWT, Swing, JavaFX & SWT 9
D JTable - Auto-Selektion NACH Zelleditierung steuern AWT, Swing, JavaFX & SWT 2
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
melaniemueller Wortliste in einer Datei ablegen AWT, Swing, JavaFX & SWT 12
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
Jose05 JavaFx Fxml: GUI aus einer anderen Klasse starten AWT, Swing, JavaFX & SWT 1
U Was genau ist das Objekt einer affinentransformation? AWT, Swing, JavaFX & SWT 1
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
mac2010 JavaFX Einbindung einer Karte AWT, Swing, JavaFX & SWT 1
donnico2 Objekte in der GUI ausgeben mit Hilfe einer DAO AWT, Swing, JavaFX & SWT 1
Kohl Jedes Objekt einer JTable um ein Zeichen verkürzen AWT, Swing, JavaFX & SWT 7
W Aufrufen einer bestimmten Scene mit if-Bedingung AWT, Swing, JavaFX & SWT 4
J Ablaufsteuerung/Anleitung machen mit JDialog und einer Zustandsmaschine AWT, Swing, JavaFX & SWT 1
missy72 JavaFX Wiederholen einer IF-Abfrage beim erneuten Öffnen einer Stage AWT, Swing, JavaFX & SWT 11
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
S JavaFX - mit Listener Veränderungen in einer TableView abhören AWT, Swing, JavaFX & SWT 3
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
HoT Sortieren von ein paar Zeilen in einer Tabelle, aber nicht die ganze Tabelle AWT, Swing, JavaFX & SWT 3
kodela Swing Element einer JComboBox ausgrauen AWT, Swing, JavaFX & SWT 3
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
H Daten aus einer XML(x83-Datei) in einem JFrame anzeigen lassen AWT, Swing, JavaFX & SWT 9
N Aufruf einer anderen Klasse durch Button ActionListener AWT, Swing, JavaFX & SWT 2
N Einer TextArea ein ScrollPane hinzufügen AWT, Swing, JavaFX & SWT 8
L JavaFX Exception nach includieren einer fxml // nested controller AWT, Swing, JavaFX & SWT 1
K Probleme bei der Erstellung und Ausführung einer Jar Datei AWT, Swing, JavaFX & SWT 2
A checkbox in einer TableView abhängig von einem anderen Celleninhalt disablen AWT, Swing, JavaFX & SWT 1
G Verknüpfung einer pdf Datei AWT, Swing, JavaFX & SWT 2
B Ausgaben einer Umrechnung vom Textfeld in ein Label AWT, Swing, JavaFX & SWT 2
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
D Zeilenumbruch in einer JTable AWT, Swing, JavaFX & SWT 9
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
@SupressWarnings() JavaFX Auf den Controller einer ListCell zugreifen AWT, Swing, JavaFX & SWT 4
Drachenbauer Swing Wie ändere ich den Hintergrund vom Anzeigefeld einer JComboBox, die nicht zum Hineinschreiben offen steht? AWT, Swing, JavaFX & SWT 32
H 3 verschiedene Nachrichten in einer FXML View die Infos kommen aus DB AWT, Swing, JavaFX & SWT 4
karlmasutra JavaFX Zugriff auf eine erzeugte Scene aus einer anderen Klasse AWT, Swing, JavaFX & SWT 1
S Java GUI durch variable Größe einer Map anpassen AWT, Swing, JavaFX & SWT 3
B Textfelder in einer ListView ausgeben AWT, Swing, JavaFX & SWT 13
J Searchfunktion auf einer MS Access Datenbank AWT, Swing, JavaFX & SWT 7
B Text im Tetfeld in einer TableView darstellen AWT, Swing, JavaFX & SWT 20
M Inhalte einer FlowPane AWT, Swing, JavaFX & SWT 4
W Swing JTable Zeilenumbruch innerhalb einer Zelle AWT, Swing, JavaFX & SWT 3
E Prinzip: wie man Ereignisse in einer GUI verarbeit. Frage zum Design? AWT, Swing, JavaFX & SWT 10
FRI3ND JavaFX: Wie kann ich einer Scene Argumente übergeben? AWT, Swing, JavaFX & SWT 14
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
G JavaFX JavaFX-Dialog aus einer Nicht-JavaFX-Anwendung heraus AWT, Swing, JavaFX & SWT 1
1 Swing Progressbar benutzen um Fortschritt einer Methode anzuzeigen AWT, Swing, JavaFX & SWT 4
K JavaFX ViewTable mit einer LinkedList befüllen AWT, Swing, JavaFX & SWT 3
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
J Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht AWT, Swing, JavaFX & SWT 5
D Java FX Image in einer Webanwendung annotieren und den Bereich ausschneiden AWT, Swing, JavaFX & SWT 0
L Java- UI zweites Fenster aus einer anderen Klasse öffnen durch ButtonClick AWT, Swing, JavaFX & SWT 4
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing Ausführung einer SwingWorker Klasse stoppen AWT, Swing, JavaFX & SWT 4
xYurisha JLabel Text einer geöffneten Gui über eine andere Klasse ändern! AWT, Swing, JavaFX & SWT 3
xYurisha Aus einer Gui Buttons, Label und ProgessBars entfernen AWT, Swing, JavaFX & SWT 4
MiMa Selektion aus einer ListView AWT, Swing, JavaFX & SWT 5
J 2D-Grafik Background einer Jpanel Klasse ändern AWT, Swing, JavaFX & SWT 1
J JFram Location aus Konstruktor einer anderen Klasse auslesen AWT, Swing, JavaFX & SWT 10
L Methode zum Füllen einer ComboBox AWT, Swing, JavaFX & SWT 4
J Suche nach einer horizontal aufklappbaren Toolbar AWT, Swing, JavaFX & SWT 1
P Variable einer Eingabe in anderes Textfeld schreiben AWT, Swing, JavaFX & SWT 7
D JavaFX Einbinden einer .fxml AWT, Swing, JavaFX & SWT 1
B Zeile einer Tabelle selektieren AWT, Swing, JavaFX & SWT 1
A Prüfung einer Eingabe auf Gleitkommazahl AWT, Swing, JavaFX & SWT 5
J Suchmaschine einer Datenbank AWT, Swing, JavaFX & SWT 5
Kanda Sorata Inhalt einer .txt Datei einlesen und in ein Label einfügen (JavaFX) AWT, Swing, JavaFX & SWT 2
A Swing JLabels in einer ForEach Schleife an den JPanel anheften (UNO Netzwerkspiel) AWT, Swing, JavaFX & SWT 1
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
M Auswahl aus einer ListView AWT, Swing, JavaFX & SWT 3
J JavaFX - Felder (Label) in einer ForSchleife bearbeiten AWT, Swing, JavaFX & SWT 4
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
L Dynamischer Aufbau einer Tabelle über Objekte AWT, Swing, JavaFX & SWT 2
C JavaFX Tief setzen in der Überschrift einer Tabellenspalte AWT, Swing, JavaFX & SWT 3
D Swing Größe einer JComboBox im GridBagLayout aufgrund der maximalen Länge der enthaltenen Daten AWT, Swing, JavaFX & SWT 7
R Java FX - Fxml - relative Größenangaben für Breite und Höhe einer TextArea AWT, Swing, JavaFX & SWT 8
M Wert einer Zelle aus JTable ziehen AWT, Swing, JavaFX & SWT 4
P Einer JList mit eigenem ListModel einen Eintrag hinzfügen AWT, Swing, JavaFX & SWT 5
K JTable in extra Klasse, Zugriff in einer anderen klasse nicht möglich AWT, Swing, JavaFX & SWT 26

Ähnliche Java Themen

Neue Themen


Oben