Applet Bild zu laufzeit hinzufügen

Status
Nicht offen für weitere Antworten.

Aldimann

Bekanntes Mitglied
Hi zusammnen,

hab noch nicht wirklich viel mit Applets gemacht und hatte eben mal schnell was zusammen gezimmert.

Dabei habe ich auf das Applet ein GIF gelegt und auf dieses GIF sollen nach User eingaben weitere GIF.

Allerdings bin ich etwas überfordert damit.

1. Passiert das ganze in einem MouseListener
2. Ist das 2. Bild ein anderes als das was gleich zu Anfang aufgelegt wird.

Wenn ich jetzt in dem Listener :
Java:
 	Graphics g = getGraphics();
	    g.drawImage(img, x, y, this);

wäre ja this der Mouse Listener.
 

Aldimann

Bekanntes Mitglied
Java:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class View extends Applet {
	
	private static final int SIZE_X =350;
	private static final int SIZE_Y =300;

  public void init () {
	  this.setSize(SIZE_X, SIZE_Y);
	  this.addMouseListener(new MouseListener(){

		public void mouseClicked(MouseEvent e) {

		
		}

		public void mouseEntered(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		public void mouseExited(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}

		public void mousePressed(MouseEvent e) {
			int x = 0;
			int y = 0;
			
			for(int i=1;i<=SIZE_X/50;i++){
				if(e.getX()<=i*50){
					x = i-1;
					break;
				}
			}
			for(int i=1;i<=SIZE_Y/50;i++){
				if(e.getY()<=i*50){
					y = i -1;
					break;
				}
			}
			x = x * 50;
			y = y * 50;
			
			drawSpielerRot(x,y);
			
		    Image img2 = getImage(getCodeBase(), "SpielerRot.gif");			
			Graphics g = getGraphics();
			g.drawImage(img2,x,y, View.this);

			
		}

		public void mouseReleased(MouseEvent e) {
			// TODO Auto-generated method stub
			
		}
		  
	  });
	  
  }
  
	  Image img;
	  MediaTracker tr;
  @Override
public void paint(Graphics g) {
		tr = new MediaTracker(this);
	    img = getImage(getCodeBase(), "Feld.gif");
	    tr.addImage(img,0);
	    g.drawImage(img, 0, 0, this);
	 }
  
  private void drawSpielerRot(int x, int y){
	}

}


Wie gesagt ich hab davon noch nicht wirklich plan.
Was sollte man dann an der Stelle hernehmen?

Jetzt funktionierts soweit, aber wenn ich das Fenster in den Hintergrund mache und wieder nach vorn hole sind die Bilder die im nachhinein darauf gelegt wurden weg ^^...
 

Schandro

Top Contributor
1. Man malt NUR in der paint-Methode. Diese wird in verschiedenen Situationen automatisch aufgerufen (z.b. wenn man ein anderes Fenster über das Applet bewegt und dann wegbewegt), oder wenn man es dazu auffordert. (
Code:
repaint();
)

2. Du brauchst ein Model. (ich nehm jetzt mal an das du versuchst TicTacToe nachzuprogrammieren). Im sogenannten "Model" werden Daten gespeichert, in deinem Fall der Zustand der Felder (LEER oder besetzt von PLAYER1 oder PLAYER2)

Ein Beispiel: (ich verwend jetzt einfach mal ein "enum", da diese am besten für sowas geeignet sind. Wahrscheinlich wirst du noch nie was mit enums gemacht haben, dass ist nicht schlimm, diese sind eigentlich relativ selbsterklärend, wenn du es trotzdem genauer wissen willst wie enums funktionieren kannst du ja immernoch was darüber lesen)
Java:
public class TicTacToe extends JApplet{
	
	enum FieldState{
		EMPTY,
		PLAYER1, 
		PLAYER2
	}
		
	FieldState[][] field = new FieldState[3][3]; // Das TicTacToe-Feld ist 3 * 3 Felder groß, deswegen ein 3*3 Array
	
}
Bis jetzt haben wir nur das "Model", in unseren Fall die Membervariable "field". Ich hab außerdem das enum "FieldState" definiert, mit unseren 3 verschiedenen Zuständen.


Jetzt müssen wir erstmal sicherstellen, dass unser field richtig initialisiert ist. Am Anfang sind alle Felder bei TicTacToe "empty". Da unsere Klasse ein JApplet ist, wird die Methode "init" beim starten des Applets aufgerufen. Dort können wir unser field initialisieren.
So sieht der Code jetzt aus:
Java:
public class TicTacToe extends JApplet{
	
	enum FieldState{
		EMPTY,
		PLAYER1,
		PLAYER2
	}
		
	FieldState[][] field = new FieldState[3][3]; // Das TicTacToe-Feld ist 3 * 3 Felder groß, deswegen ein 3*3 Array

	@Override
	public void init(){
		for(int i=0;i<field.length;++i){
			for(int e=0;e<field[i].length;++e){
				field[i][e] = FieldState.EMPTY;
			}
		}
	}
}


Jetzt erweitern wir den Code um unser View, d.h. um das was der Benutzer sieht. In unserem Fall malen wir direkt auf das Applet, ist für jetzt ok, bei größeren Programmen sollte man das aber anders machen. AUßERDEM GIBT ES EINEN DARSTELLUNGSFEHLER, WENN MAN EIN FENSTER ÜBER DAS APPLET BEWEGT.
So sieht der Code aus, wenn ich ihn um die paint-Methode erweiter, in der ich nur die 4 Striche male die das Feld ansich bilden.
Java:
public class TicTacToe extends JApplet{
	
	enum FieldState{
		EMPTY,
		PLAYER1,
		PLAYER2
	}
		
	FieldState[][] field = new FieldState[3][3]; // Das TicTacToe-Feld ist 3 * 3 Felder groß, deswegen ein 3*3 Array

	@Override
	public void init(){
		for(int i=0;i<field.length;++i){
			for(int e=0;e<field[i].length;++e){
				field[i][e] = FieldState.EMPTY;
			}
		}
	}
	
	@Override
	public void paint(Graphics g){
		super.paint(g); // sollte man immer als erstes aufrufen wenn man eine paint-Methode überschreibt. Ist einfach so...
		
		
		// die aktuelle Höhe und Breite des Applets
		int width = (int) this.getSize().getWidth();
		int height = (int) this.getSize().getHeight();
		
		
		// wir malen das TicTacToe-Raster
		g.drawLine((int)(1.0/3.0*width) , 0 , (int)(1.0/3.0*width) , height);
		g.drawLine((int)(2.0/3.0*width) , 0 , (int)(2.0/3.0*width) , height);
		g.drawLine(0 , (int)(1.0/3.0*height), width, (int)(1.0/3.0*height));
		g.drawLine(0 , (int)(2.0/3.0*height), width, (int)(2.0/3.0*height));
		
	}
}

In der paint-Methode müssen aber natürlich auch die Steine gemalt werden, die die Spieler gesetzt haben. Deswegen schreiben wir noch an Schluss der paint-Methode folgendes:
Java:
		// iteriert über jedes Feld
		for(int i=0;i<field.length;++i){
			for(int e=0;e<field[i].length;++e){
				switch(field[i][e]){ // je nachdem welchen Zustand dieses Feld hat wird was anderes gemalt
					case EMPTY:
						// malt nichts
						break;
					case PLAYER1:
						// malt einen roten Stein an die Position dieses Feldes
						g.setColor(Color.RED);
						g.fillOval((int)(i/3.0*width), (int)(e/3.0*height), (int)(1.0/3.0*width) , (int)(1.0/3.0*height));
						break;
					case PLAYER2:
						// malt einen blauen Stein an die Position dieses Feldes
						g.setColor(Color.BLUE);
						g.fillOval((int)(i/3.0*width), (int)(e/3.0*height), (int)(1.0/3.0*width) , (int)(1.0/3.0*height));
						break;
					default:
						// kann nicht passieren, man sollte aber in jedem switch-case Block auch den default-case definieren 
						System.out.println("Fehler, default-case in paint. Kann eigentlich nicht passieren");
				}
			}
		}

So, jetzt brauchen wir nurnoch das "Control", d.h. den Code der der auf Eingaben vom User reagiert. In diesem Fall wird darauf geachtet, wenn der Benutzer auf das Spielfeld klickt. Dann wird jeweils berechnet auf welches der 9 Felder der Benutzer genau geklickt hat. Auf dieses wird dann ein Stein gesetzt, wenn es noch EMPTY ist.
Dazu registrieren wird einen MouseListener auf das Applet. Dies tun wir in der init-Methode:
Java:
		this.addMouseListener(new MouseListener() {			
			
			@Override
			public void mouseReleased(MouseEvent event) {
				// der Benutzer hat eine Maustaste losgelassen. Wir berechnen auf welchen Feld das war:

				int fieldWidth = (int)(1.0/3.0*TicTacToe.this.getSize().getWidth());
				int fieldHeight = (int)(1.0/3.0*TicTacToe.this.getSize().getHeight());

				int getroffenesFeldIndexX = event.getX()/fieldWidth;
				int getroffenesFeldIndexY = event.getY()/fieldHeight;
				
				// debug-Ausgabe
				System.out.println("Benutzer hat auf Feld ["+getroffenesFeldIndexX+"|"+getroffenesFeldIndexY+"] geklickt");
				
				// kontrolliert ob das getroffene Feld noch leer ist
				if(field[getroffenesFeldIndexX][getroffenesFeldIndexY] == FieldState.EMPTY){
					// das angeklickte Feld ist noch leer. Wir nehmen an, das der Benutzer PLAYER1 ist.
					field[getroffenesFeldIndexX][getroffenesFeldIndexY] = FieldState.PLAYER1;
					
					// jetzt müssen wir den Computer einen Stein setzten lassen
					// TODO TicTacToe-KI programmieren
					
					// danach malen wir das Spielfeld neu, da sich das Model ja jetzt geändert hat.
					TicTacToe.this.repaint();
				}
				else{
					// Auf diesen Feld liegt bereits ein Stein
					JOptionPane.showMessageDialog(TicTacToe.this, "Das Feld ist bereits besetzt.");
				}
			}	
			
			// die ganzen anderen Event-MEthoden brauchen wir nicht und lassen sie leer:
			@Override
			public void mousePressed(MouseEvent event) {				
			}			
			@Override
			public void mouseExited(MouseEvent event) {				
			}			
			@Override
			public void mouseEntered(MouseEvent event) {				
			}			
			@Override
			public void mouseClicked(MouseEvent event) {				
			}
		});


Und schon funktioniert ein bisschen vom TicTacToe. Es fehlt jetzt nurnoch eine KI für den Computer bzw. PLAYER2 und eine Logik die erkennt, ob einer der Spieler gewonnen hat.


Hier der Komplette Code:
Java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

import javax.swing.JApplet;
import javax.swing.JOptionPane;

public class TicTacToe extends JApplet{
	
	enum FieldState{
		EMPTY,
		PLAYER1,
		PLAYER2
	}
		
	FieldState[][] field = new FieldState[3][3]; // Das TicTacToe-Feld ist 3 * 3 Felder groß, deswegen ein 3*3 Array

	@Override
	public void init(){
		for(int i=0;i<field.length;++i){
			for(int e=0;e<field[i].length;++e){
				field[i][e] = FieldState.EMPTY;
			}
		}
		
		this.addMouseListener(new MouseListener() {			
			
			@Override
			public void mouseReleased(MouseEvent event) {
				// der Benutzer hat eine Maustaste losgelassen. Wir berechnen auf welchen Feld das war:

				int fieldWidth = (int)(1.0/3.0*TicTacToe.this.getSize().getWidth());
				int fieldHeight = (int)(1.0/3.0*TicTacToe.this.getSize().getHeight());

				int getroffenesFeldIndexX = event.getX()/fieldWidth;
				int getroffenesFeldIndexY = event.getY()/fieldHeight;
				
				// debug-Ausgabe
				System.out.println("Benutzer hat auf Feld ["+getroffenesFeldIndexX+"|"+getroffenesFeldIndexY+"] geklickt");
				
				// kontrolliert ob das getroffene Feld noch leer ist
				if(field[getroffenesFeldIndexX][getroffenesFeldIndexY] == FieldState.EMPTY){
					// das angeklickte Feld ist noch leer. Wir nehmen an, das der Benutzer PLAYER1 ist.
					field[getroffenesFeldIndexX][getroffenesFeldIndexY] = FieldState.PLAYER1;
					
					// jetzt müssen wir den Computer einen Stein setzten lassen
					// TODO TicTacToe-KI programmieren
					
					// danach malen wir das Spielfeld neu, da sich das Model ja jetzt geändert hat.
					TicTacToe.this.repaint();
				}
				else{
					// Auf diesen Feld liegt bereits ein Stein
					JOptionPane.showMessageDialog(TicTacToe.this, "Das Feld ist bereits besetzt.");
				}
			}	
			
			// die ganzen anderen Event-MEthoden brauchen wir nicht und lassen sie leer:
			@Override
			public void mousePressed(MouseEvent event) {				
			}			
			@Override
			public void mouseExited(MouseEvent event) {				
			}			
			@Override
			public void mouseEntered(MouseEvent event) {				
			}			
			@Override
			public void mouseClicked(MouseEvent event) {				
			}
		});
	}
	
	@Override
	public void paint(Graphics g){
		super.paint(g); // sollte man immer als erstes aufrufen wenn man eine paint-Methode überschreibt. Ist einfach so...
		
		
		// die aktuelle Höhe und Breite des Applets
		int width = (int) this.getSize().getWidth();
		int height = (int) this.getSize().getHeight();
		
		
		// wir malen das TicTacToe-Raster
		g.setColor(Color.BLACK);
		g.drawLine((int)(1.0/3.0*width) , 0 , (int)(1.0/3.0*width) , height);
		g.drawLine((int)(2.0/3.0*width) , 0 , (int)(2.0/3.0*width) , height);
		g.drawLine(0 , (int)(1.0/3.0*height), width, (int)(1.0/3.0*height));
		g.drawLine(0 , (int)(2.0/3.0*height), width, (int)(2.0/3.0*height));
		
		
		// iteriert über jedes Feld
		for(int i=0;i<field.length;++i){
			for(int e=0;e<field[i].length;++e){
				switch(field[i][e]){ // je nachdem welchen Zustand dieses Feld hat wird was anderes gemalt
					case EMPTY:
						// malt nichts
						break;
					case PLAYER1:
						// malt einen roten Stein an die Position dieses Feldes
						g.setColor(Color.RED);
						g.fillOval((int)(i/3.0*width), (int)(e/3.0*height), (int)(1.0/3.0*width) , (int)(1.0/3.0*height));
						break;
					case PLAYER2:
						// malt einen blauen Stein an die Position dieses Feldes
						g.setColor(Color.BLUE);
						g.fillOval((int)(i/3.0*width), (int)(e/3.0*height), (int)(1.0/3.0*width) , (int)(1.0/3.0*height));
						break;
					default:
						// kann nicht passieren, man sollte aber in jedem switch-case Block auch den default-case definieren 
						System.out.println("Fehler, default-case in paint. Kann eigentlich nicht passieren");
				}
			}
		}
		
	}
}
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Bild im Applet anzeigen Java Basics - Anfänger-Themen 3
M Java-Applet: Bild einbinden (getImage) Java Basics - Anfänger-Themen 0
N Erste Schritte Applet zeichnet Bild nicht Java Basics - Anfänger-Themen 10
M Bild in Applet darstellen Java Basics - Anfänger-Themen 6
B Bild in Applet anzeigen Java Basics - Anfänger-Themen 5
M Java Applet bild einfügen Java Basics - Anfänger-Themen 6
0 Problem mit Bild und Sound im Applet Java Basics - Anfänger-Themen 12
0 Bild in Applet einfügen Java Basics - Anfänger-Themen 3
G Jpg Bild im Applet laden Java Basics - Anfänger-Themen 4
X Applet Bild einbinden Java Basics - Anfänger-Themen 22
S Bild in ein Applet einbetten Java Basics - Anfänger-Themen 12
M Java-Applet zur Mittelwertberechnung Java Basics - Anfänger-Themen 3
D Java Applet wird nicht im Browser angezeigt Java Basics - Anfänger-Themen 6
M bestehendes Projekt als Applet speichern Java Basics - Anfänger-Themen 2
S Erste Schritte Java - Applet - Rechteck ständig versetzen Java Basics - Anfänger-Themen 14
A Applet Plot für atan erstellen Java Basics - Anfänger-Themen 1
S Erste Schritte Java Applet lässt sich im Browser nicht öffnen Java Basics - Anfänger-Themen 9
K JDK installieren displays java applet für MAC Java Basics - Anfänger-Themen 10
S Zeichen von abgerundeten Rechtecken auf einem Applet Java Basics - Anfänger-Themen 5
J Einfache einbindung eines Bildes in ein Applet Java Basics - Anfänger-Themen 4
S Klassen Applet extern aufrufen Java Basics - Anfänger-Themen 1
J Erstes Applet läßt sich nicht anzeigen Java Basics - Anfänger-Themen 2
C Applet Probleme Java Basics - Anfänger-Themen 1
A Compiler-Fehler Problem beim einbinden der applet Klasse Java Basics - Anfänger-Themen 2
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
G Applet in ein JSP einbinden Java Basics - Anfänger-Themen 1
C Java-Applet Fehler "NoClassDefFoundError"? Java Basics - Anfänger-Themen 1
C Java Applet Fragen: Serialisierung, Excel import Java Basics - Anfänger-Themen 2
C Kalender in Applet einfügen Java Basics - Anfänger-Themen 0
J JavaScript findet Applet Methode nicht Java Basics - Anfänger-Themen 2
J Punkte im Java-Applet verbinden Java Basics - Anfänger-Themen 4
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0
K Applet funz. im Browser nicht Java Basics - Anfänger-Themen 11
thet1983 Erste Schritte <param> Tag in Applet Java Basics - Anfänger-Themen 4
F Swing Applet: mehrere Komponenten hinzufügen Java Basics - Anfänger-Themen 1
F Platzieren von Komponenten in Swing Applet funktioniert nicht Java Basics - Anfänger-Themen 3
G Signiertes Applet wird nicht ausgeführt Java Basics - Anfänger-Themen 1
Y Applet: Verschlüsselung Java Basics - Anfänger-Themen 3
B JPanel/JFrame in ein Applet umwandeln (Webfähig) Java Basics - Anfänger-Themen 7
F signiertes Applet fkt. nicht bei lokalem Aufruf Java Basics - Anfänger-Themen 2
K Frage zu Applet Java Basics - Anfänger-Themen 3
V While Schleife für ganzes Applet Java Basics - Anfänger-Themen 6
P Applet Histogramm Java Basics - Anfänger-Themen 6
H 27 Kreise Zeichnen Java Applet Java Basics - Anfänger-Themen 2
G Java Applet aus Eclipse heraus testen? Java Basics - Anfänger-Themen 6
S Applet findet Klasse nicht Java Basics - Anfänger-Themen 7
R Java Applet mit Mausklick ansprechen Java Basics - Anfänger-Themen 3
C Java Applet in html. Pong - old school Spiel Java Basics - Anfänger-Themen 10
S Applet-Objekt ist vor dem Hintergrund Java Basics - Anfänger-Themen 11
F Problem mit Applet Java Basics - Anfänger-Themen 5
A Applet mit Object-Tags einbinden. Java Basics - Anfänger-Themen 3
S Erste Schritte Fenster wechsel im Applet Java Basics - Anfänger-Themen 7
S Applet Deployment Java Basics - Anfänger-Themen 2
X Applet Fehler: java.lang.reflect.InvocationTargetException Java Basics - Anfänger-Themen 45
H Applet - main()-Methode Java Basics - Anfänger-Themen 4
K Applet wird nicht im Browser und Appletviewer angezeigt Java Basics - Anfänger-Themen 5
L Applet : keine Recht für Zugriff auf Clipboard (trotz Zertifikat) Java Basics - Anfänger-Themen 4
H Klassen in Eclipse stellt es im Ausgabe-Applet nicht dar Java Basics - Anfänger-Themen 5
L Applet soll Html-File öffnen Java Basics - Anfänger-Themen 2
L NetBeans Applet in html Java Basics - Anfänger-Themen 4
Dogge Start:Applet nicht Initialisiert Java Basics - Anfänger-Themen 11
D Applet beenden Java Basics - Anfänger-Themen 7
Dogge Problem mit paint(Graphics g) im Applet Java Basics - Anfänger-Themen 13
M RSA Applet ohne Cipher Java Basics - Anfänger-Themen 15
B String verschlüsseln - Applet - ohne BASE64 Java Basics - Anfänger-Themen 7
S Methode in Applet starten Java Basics - Anfänger-Themen 2
M AWT Applet - Button aus anderer Klasse abfragen Java Basics - Anfänger-Themen 4
W Probleme mit Java Applet Java Basics - Anfänger-Themen 5
M Applet kann in Browser nicht ausgeführt werden Java Basics - Anfänger-Themen 4
L Applet: Laden unterbricht den Browserfokus (scrollen) Java Basics - Anfänger-Themen 2
Z Applet startet nicht bei Domain mit Umlaut Java Basics - Anfänger-Themen 2
B Externe Libraries fuer Applet ... Pfad eingeben? Java Basics - Anfänger-Themen 23
Helgon ClassNotFound Applet Java Basics - Anfänger-Themen 6
U Applet Signiert und trotzdem Fehlermeldung Java Basics - Anfänger-Themen 18
E Schach in Java-Applet <No main classes found> Java Basics - Anfänger-Themen 5
S Applet Java Basics - Anfänger-Themen 2
S [Applet] Objekte von init bei paint benutzen Java Basics - Anfänger-Themen 9
E Applet wird nicht angezeigt Java Basics - Anfänger-Themen 11
P Problem- Java Applet wird nicht ausgeführt Java Basics - Anfänger-Themen 9
B Applet - Laden eines Java-Fensters bricht ab Java Basics - Anfänger-Themen 6
N Import Problem, Applet will nicht Java Basics - Anfänger-Themen 6
M Applet Eclipse Vollbild Java Basics - Anfänger-Themen 3
K Befehl per Shell an Java-Applet JAR übergeben Java Basics - Anfänger-Themen 16
I Java Applet Java Basics - Anfänger-Themen 8
D Java Applet Dateien auf Server auslesen? Java Basics - Anfänger-Themen 8
L Referenced Libraries korrekt in Java Applet einbinden.. Java Basics - Anfänger-Themen 2
KBJ Java Applet Gästebuch Java Basics - Anfänger-Themen 12
T Java Applet braucht mehrere Minuten zu Start Java Basics - Anfänger-Themen 5
U Applet wird nicht angezeigt Java Basics - Anfänger-Themen 2
J J-Applet, Frage Java Basics - Anfänger-Themen 19
J Applet farblich gestalten Java Basics - Anfänger-Themen 5
M Applet lokaler Festplattenzugriff Java Basics - Anfänger-Themen 25
X Applet - Client/Server Java Basics - Anfänger-Themen 2
M Applet ist nur graues Feld Java Basics - Anfänger-Themen 12
O webserver für Applet und php Java Basics - Anfänger-Themen 7
J Fehlermeldung: Applet nicht initialisiert Java Basics - Anfänger-Themen 24
C Java Applet Probleme Java Basics - Anfänger-Themen 4
S Probleme mit Java 3D Tutorial (Applet) Java Basics - Anfänger-Themen 7
S Input/Output Problem mit dateizugriff innerhalb der .jar (Applet) Java Basics - Anfänger-Themen 2
M Applet + BilderDownload Java Basics - Anfänger-Themen 36

Ähnliche Java Themen

Neue Themen


Oben