Mausklick im Applet und Frame gleichzetitg ausführen

bueko

Grünschnabel
Hallo,

ich schreibe zurzeit an einem Applet das ein Canvas-Objekt beinhaltet , welches auf Mausklick die Farbe ändert. Parallel soll ein Fenster (Frame-Objekt) geöffnet werden, in dem auch ein Canvas-Objekt steckt.

Sobald im Applet das Canvas-Objekt anklickt wird, soll im Frame-Objekt die Farbe ebenfalls geändert werden.

Wie kann ich gleichzeitig, dass im Frame-Objekt hinterlegte Canvas-Objekt ansprechen?

Vielen lieben Dank für Eure Hilfe.
 
Ich würde an deiner Stelle das Canvas als Klassenvariable abspeichern und immer darüber zugreifen. Dann noch ins Frame eine public void, die die Änderungen durchführt. (z. B. this.canvas.setBackground(Color.red);)
 
Hallo,

vielen Dank für die Rückmeldung. Leider bekomme ich immer eine NullPointerException. Ich denke, dass ich die Vorgehensweise von Kai008 falsch umsetze.

Bei Interesse stelle ich gerne den Code zur Verfügung.
 
Ich denke du hast nur vergessen in die Klassenvariable die Instanz des Canvas zu schreiben. Zeig dem Code bitte mal. (Bitte vergiss nicht ihm im Java- oder wenigstens Code-Tag zu fassen.)
 
Code:
import java.applet.Applet;
import java.awt.Color;
import java.awt.Image;
import java.awt.Component;

/**
 * @author admin
 * Überschreibung der init-Methode und Initialisierung des
 * Rasters und der Farben
 */

public class Mosaik extends Applet implements SteuerIF {

	private int raster, rasterPF;	// Raster des Spiels und Protokollfenster
	private String bildName;	// Name der Bilddatei
	private Image image;	// Image-Objekt zu "bildName"
	private BildMosaik bm;	// Panel mit Canvas-Objekten
	private FarbMosaik fm;
	private VorschauCanvas vorschauBild;
	private boolean zuletztBild;
	private Color farbeRueckseite;
	private Color farbeVorderseite;
	private Component steuerPanel;
	private MosaikFrame mf;

	public void init() {
		// Parameter einlesen
		String temp = getParameter("raster");
		try {
			raster = Integer.parseInt(temp);
		} catch (NumberFormatException nfe) {
			raster = 5;
			System.out.println("Raster auf default = " + raster + " gesetzt.\n" + nfe.toString());
		}

		bildName = getParameter("bildName");
		farbeRueckseite = new Color(230, 30, 50);
		farbeVorderseite = new Color(50, 210, 30);
		image = this.getImage(getCodeBase(), bildName);

		// MediaTracking im ImageHandler
		image = ImageHandler.trackImage(image, this);

		// Zunächst Vorschaubild anzeigen
		vorschauBild = new VorschauCanvas(image);
		add(vorschauBild);
		steuerPanel = new SteuerPanel(this);
		add(steuerPanel);
	}

	/**
	 * Der Neuaufbau der Spielfläche besteht aus der einfachen Alternative, entweder ein
	 * BildMosaik- oder ein FarbMosaik-Objekt zu erzeugen und in das Applet einzufügen.
	 * Danach wird das Steuer-Panel wieder ergänzt.
	 */
	public void startGame(int raster, boolean modus, boolean protokoll) {
		if(vorschauBild != null) {
			remove(vorschauBild);
			vorschauBild = null;
		} else {

			if(zuletztBild) {
				remove(bm); // BildMosaik-Panel
			} else {
				remove(fm); // FarbMosaik-Panel
			}
		}

		if(modus) { 	// true = Bildvariante
			bm = new BildMosaik(raster, farbeRueckseite, image);
			add(bm);
			zuletztBild = true;
		} else {
			fm = new FarbMosaik (raster, image.getWidth(this), farbeRueckseite, farbeVorderseite);
			add(fm);
			zuletztBild = false;
		}

		// Frame öffnen
		if (protokoll) {
			rasterPF = raster;
			mf = new MosaikFrame(raster, image.getWidth(this), farbeRueckseite, farbeVorderseite);
			mf.setTitle("Protokollfenster");
			mf.setSize(getSize());
			mf.setLocation(630,0);
			mf.show();
			mf.umdrehenKarte();
        }

		add(steuerPanel);
		/**
		 * Die Methode validate() sorgt dafür, dass das Applet ein gültiges Layout erhält.
		 * Sie soll aufgerufen werde, wenn eine Komponente in einem Container hinzugefügt
		 * oder modifiziert wurde. Erst durch diese Methode erfolgt die neue Benutzeroberfläche
		 * (View).
	 	*/
		validate();
	}

	public void resetGame() {
		validate();
		mf.setVisible(false);
	}
}

Code:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Frame;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;

/**
 * @author Admin
 *
 */

public class MosaikFrame extends Frame {

	private MosaikModel mosaikModel;
	private MosaikEventHandler eventHandler;
	private MosaikCanvas mc;

	/**
	 * @return
	 */
	public MosaikEventHandler getEventHandler() {
		return eventHandler;
	}

	// Konstruktor
	public MosaikFrame (int raster, int breite, Color farbeRueckseite, Color farbeVorderseite) {
		mosaikModel = new MosaikModel(raster, raster);
		eventHandler = new MosaikEventHandler(mosaikModel);
		this.setLayout(new GridLayout(raster, raster, 1, 1));
		int canvasBreite = breite/raster;

		for(int i=0; i < raster; i++) {
			for(int j=0; j < raster; j++) {
				MosaikCanvas mc = new MosaikCanvas(i, j, farbeRueckseite, farbeVorderseite);
				mc.addMouseListener(eventHandler);
				mosaikModel.putObj(i, j, mc);
				mc.setSize(canvasBreite, canvasBreite);
				add(mc);
			}
		}
  	}

  	// Methode
  	public void umdrehenKarten() {
		this.mc.switchSeite();
	}
}

Code:
import java.awt.*;
/**
 *
 * @author Admin *
 *
 */

public class MosaikCanvas extends Canvas implements MosaikIF {

	private Color farbe, farbeRueckseite, farbeVorderseite;
	public Color getFarbe() { return farbe; }
	public void setFarbe(Color inValue) { farbe = inValue; }

	private boolean vorderseite = false;
	public boolean isVorderseite() { return vorderseite; }

	private int zeile, spalte;
	public int getZeile() { return zeile; }
	public int getSpalte() { return spalte; }

	/**
	 *
	 * @param zeile
	 * @param spalte
	 * @param farbeRueckseite
	 * @param farbeVorderseite
	 */

	public MosaikCanvas(int zeile, int spalte, Color farbeRueckseite, Color farbeVorderseite) {
		this.zeile = zeile;
		this.spalte = spalte;
		this.farbeRueckseite = farbeRueckseite;
		this.farbeVorderseite = farbeVorderseite;
		this.setFarbe(farbeRueckseite);
	}

	public void switchSeite() {
		vorderseite =! vorderseite;
		farbe = (farbe == farbeRueckseite) ? farbeVorderseite : farbeRueckseite;
		repaint();
	}

	public void paint (Graphics g) {
		g.setColor(getFarbe());
		g.fillRect(0,0, this.getSize().width-1, this.getSize().height-1);
	}
}
 
Scheinst du doch gemacht zu haben. Wo genau tritt der Fehler auf?
btw. man verwendet statt *.show() *.setVisible(boolean).
 
at MosaikFrame.umdrehenKarteUMosaikFrame.java:45)
Code:
// Methode
  	public void umdrehenKarten() {
		this.mc.switchSeite();
	}


at Mosaik.startGame(Mosaik.java:87)
Code:
// Frame öffnen
		if (protokoll) {
			rasterPF = raster;
			mf = new MosaikFrame(raster, image.getWidth(this), farbeRueckseite, farbeVorderseite);
			mf.setTitle("Protokollfenster");
			mf.setSize(getSize());
			mf.setLocation(630,0);
			mf.show();
			mf.umdrehenKarten();
        }
 
Nein, hast du doch nicht.

Java:
	public MosaikFrame (int raster, int breite, Color farbeRueckseite, Color farbeVorderseite)
	{
		mosaikModel = new MosaikModel(raster, raster);
		eventHandler = new MosaikEventHandler(mosaikModel);
		this.setLayout(new GridLayout(raster, raster, 1, 1));
		int canvasBreite = breite/raster;

		for(int i=0; i < raster; i++) {
			for(int j=0; j < raster; j++) {
				MosaikCanvas mc = new MosaikCanvas(i, j, farbeRueckseite, farbeVorderseite);
				mc.addMouseListener(eventHandler);
				mosaikModel.putObj(i, j, mc);
				mc.setSize(canvasBreite, canvasBreite);
				add(mc);
				this.mc = mc;
			}
		}
  	}
 
Erst mal vielen lieben Dank für deine Unterstützung.

Ich bekomme jetzt zwar keine NullPointerException mehr, aber im Frame wird direkt die Karte ganz unten rechts beim Start umgedreht und die Klicks im Applet werden leider nicht registriert.
 
Zuletzt bearbeitet:
Ach so, langsam komme ich erst hinter dem Aufbau des Projektes. ^^
Hab übersehen dass das ja eine Schleife ist, in dem Fall musst du anderst vorgehen:

Java:
	// Konstruktor
	private ArrayList<MosaikCanvas> mosaikCanvasList;
	public MosaikFrame (int raster, int breite, Color farbeRueckseite, Color farbeVorderseite)
	{
		this.mosaikCanvasList = new ArrayList<MosaikCanvas>();
		
		mosaikModel = new MosaikModel(raster, raster);
		eventHandler = new MosaikEventHandler(mosaikModel);
		this.setLayout(new GridLayout(raster, raster, 1, 1));
		int canvasBreite = breite/raster;

		for(int i=0; i < raster; i++)
		{
			for(int j=0; j < raster; j++)
			{
				MosaikCanvas mc = new MosaikCanvas(i, j, farbeRueckseite, farbeVorderseite);
				mc.addMouseListener(eventHandler);
				mosaikModel.putObj(i, j, mc);
				mc.setSize(canvasBreite, canvasBreite);
				add(mc);
				this.mosaikCanvasList.add(mc);
			}
		}
  	}
  	public void umdrehenKarten(int mouseX, int mouseY)
  	{
  		final int mcWidth = 50;
  		final int mcHeight = 50;
  		
		for(MosaikCanvas mc:this.mosaikCanvasList)
			if(mc.getX() > mouseX &&
					mc.getX() + mcWidth < mouseX &&
					mc.getY() > mouseY &&
					mc.getY() + mcHeight < mouseY)
				mc.switchSeite();
	}

Ich habe es jetzt natürlich nicht testen können aber ich denke so sollte das in etwa hinhauen.
 
Zurück