![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 |
|
Neuer Benutzer
Registriert seit: 13.10.2005
Beiträge: 5
|
Hallo,
ich schreibe seit Wochen an einem Applet, das ein folgendermaßen aussehen soll: Das Applet beinhaltet ein Canvas-Objekt, welches auf Mausklick die Farbe ändert. Parallel soll ein Fenster geöffnet werden, in dem auch ein Canvas-Objekt steckt. Soweit so gut, jetzt mein Problem: sobald man im 'Hauptapplet' das Canvas-Objekt anklickt, sollen beide Canvas-Objekte, sowohl im Hauptframe als auch im Fenster (Frame-Objekt) die Farbe ändern. Wie spreche ich das Canvas-Objekt im Felster an? bin für jeden Tipp dankbar! |
|
|
|
|
|
Nach oben #2 |
|
Sesselkleber
Registriert seit: 17.01.2005
Beiträge: 567
|
Du hast doch das Frame-Object aus dem Hauptfenster heraus geöffnet.
Also gibt es eine Instanz davon, und darüber sprichst du es dann an. PHP-Code:
|
|
|
|
|
|
Nach oben #3 |
|
Neuer Benutzer
Registriert seit: 13.10.2005
Beiträge: 5
|
vielen Dank für deine Antwort, aber die Sache ist etwas komplizierter.
Ich weiss nicht an welcher Stelle des Codes das Protokollfenster am Sinnvolsten einzufügen ist, so dass es funktioniert. Das wirst du anhand der auskommentierten Stellen im Code sehen. (die Schlüsselstellen sind fett hervorgehoben!) hier ist ein Ausschnitt des Codes, um dies besser nachzuvollziehen: Mosaik.html ------------------------------------------ <html> <body> <applet code="Mosaik.class" width="435" height="470"> <param name="raster" value="4"> <param name="bildName" value="Spielflaeche.jpg"> <param name="frame" value="on"> </applet> </body> </html> Mosaik.java ------------------------------------------ import java.awt.*; import java.awt.Image; import java.awt.Color; import java.applet.Applet; /** * Diese Klasse startet das Spiel (Applet) */ public class Mosaik extends Applet implements SteuerIF{ private int raster; //Rasteraß der Spielfläche private String bildName; //Name der Bilddatei private Image img; //das Image-Object zu bildName private BildMosaik bm; //Panel für BildCanvas-Objekte private Color farbeRueck, farbeVor; private int imageWidth; private VorschauCanvas vorschauBild; private SteuerPanel steuerPanel; private FarbMosaik fm, fmo; private boolean zuletztBild = false; private boolean showFrame = false; public void init(){ //Parameter einlesen String temp = getParameter("raster"); try{ raster = Integer.parseInt(temp); }catch(NumberFormatException nfe){ raster = 4; System.out.println("Raster auf Default-Wert="+raster+" gesetzt. NFE: "+nfe.getMessage()); } bildName = getParameter("bildName"); String sFrame = getParameter("frame"); if (sFrame.equals("on")){ showFrame = true; } //Farben und das Bild setzen farbeRueck = new Color(230, 30, 50); farbeVor = new Color(50, 210, 30); img = getImage(getCodeBase(), bildName); //MediaTracker im Imagehandler img = ImageHandler.trackImage(img, this); imageWidth = img.getWidth(this); //zunächst Vorschau GUI anzeigen vorschauBild = new VorschauCanvas(img); add(vorschauBild); steuerPanel = new SteuerPanel(this); add(steuerPanel); } public void startGame(int raster, boolean modus){ if (vorschauBild != null){ //VorschauCanvas-Objekt remove(vorschauBild); vorschauBild = null; }else{ if (zuletztBild){ remove(bm); //remove BildMosaik-Panel }else{ remove(fm); //remove FarbMosaik-Panel } } remove (steuerPanel); //remove SteuerPanel-Objekt //Protokoll-Fenster erstellen //hier wird ein zweites Objekt im Protokolfenster erzeugt! /*if (showFrame){ Frame f = new Frame ("Protokollfenster"); f.setLayout (new BorderLayout()); f.setLocation(450, 0); //Fenster positionieren f.setSize(100, 100); //grösse des Fensters bestimmen fmo = new FarbMosaik(raster, imageWidth, new Color(255,0,0), new Color(0,255,0)); f.add(fmo, BorderLayout.CENTER); f.pack(); f.show(); }*/ //Aufbau der Spielfläche if(modus){ bm = new BildMosaik(raster, imageWidth, farbeRueck, img); add(bm); zuletztBild = true; }else{ //Canvas-Objekt im Hauptfenster fm = new FarbMosaik(raster, imageWidth, farbeRueck, farbeVor, showFrame); add(fm); zuletztBild = false; } add(steuerPanel); //habe gedacht, dass man eventuell das gleiche Objekt in das Protokollfenster setzen kann, weil der EventHandler dann 'beide' Objekte verändert; -> funktioniert aber nicht! /*Frame f = new Frame ("Protokollfenster"); f.setLayout (new BorderLayout()); f.setLocation(450, 0); //Fenster positionieren f.setSize(400, 400); //grösse des Fensters bestimmen f.add(fm); f.pack(); f.show(); */ validate(); } public void resetGame(){ validate(); } FarbMosaik.java --------------------------------------------------------- import java.awt.*; import java.awt.Color; import java.awt.Panel; import java.awt.GridLayout; public class FarbMosaik extends Panel{ protected MosaikEventHandler eventHandler; ModelIF mm, mm2; Frame f; MosaikCanvas mc2; public FarbMosaik(int raster, int breite, Color farbeRueck, Color farbeVor, boolean protokoll){ //hier hatte ich gedacht die Fläche direkt mit aufzubauen würde funktionieren. /*if (protokoll){ f = new Frame ("Protokollfenster"); f.setLayout (new BorderLayout()); f.setLocation(450, 0); //Fenster positionieren f.setSize(400, 400); //grösse des Fensters bestimmen mm2 = new MosaikModel(raster, raster); 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++){ mc2 = new MosaikCanvas(i, j, farbeRueck, farbeVor); //mc2.addMouseListener(eventHandler); mm2.putMObj(i, j, mc2); //Objekte werden gespeichert mc2.setSize(canvasBreite, canvasBreite); add(mc2); f.add(mc2); } } f.pack(); f.show(); //ProtokollFenster pf = new ProtokollFenster(breite, raster); }*/ //Aufbau der Spielfläche im Hauptfenster mm = new MosaikModel(raster, raster); eventHandler = new MosaikEventHandler (mm); 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, farbeRueck, farbeVor); mc.addMouseListener(eventHandler); mm.putMObj(i, j, mc); //Objekte werden gespeichert mc.setSize(canvasBreite, canvasBreite); add(mc); } } } } MosaikEventHandler.java --------------------------------------------------------- import java.util.Hashtable; import java.util.Enumeration; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.*; /** * @author Carsten Vogel */ public class MosaikEventHandler extends java.applet.Applet implements MouseListener{ Hashtable modelTable; Object ke; ModelIF mm; public MosaikEventHandler(ModelIF mm){ modelTable = new Hashtable(); ke = new Integer(mm.hashCode()); modelTable.put(ke, mm); } //MouseListener Methoden public void mouseClicked(MouseEvent me){} public void mouseEntered(MouseEvent me){} public void mouseExited(MouseEvent me){} public void mousePressed(MouseEvent me){} /** * Implementierung des Mouselistener zwecks * Wechsel der Seite einer eingebetteten MosaikCanvas * Komponente. * Das Event-auslösende MosaikCanvas-Objekt wird ermittelt * und dessen switchSeite-Methode aufgerufen. * <code>((MosaikCanvas)me.getSource()).switchSeite() ;</code> * @see MosaikCanvas#switchSeite */ private int zeile, spalte; public void mouseReleased(MouseEvent me){ zeile = ((MosaikIF)me.getSource()).getZeile(); spalte = ((MosaikIF)me.getSource()).getSpalte(); Enumeration enum = modelTable.keys(); while (enum.hasMoreElements()){ ke = enum.nextElement(); ((ModelIF)modelTable.get(ke)).action(zeile, spalte); // dreht die Karte um (ruft die Funktion auf) } } public void addModel(ModelIF model){ ke = new Integer(model.hashCode()); modelTable.put(ke, model); } public ModelIF removeModel (ModelIF model){ ke = new Integer(model.hashCode()); return (ModelIF)modelTable.remove(ke); } } Teil 2 ... (nächste Antwort) |
|
|
|
|
|
Nach oben #4 |
|
Neuer Benutzer
Registriert seit: 13.10.2005
Beiträge: 5
|
Teil2:
MosaikModel.java ------------------------------------------------------ /** * Diese Klasse soll die komplette Programmlogik beinhalten!!! */ public class MosaikModel implements ModelIF{ MosaikIF [][] mObjects; int zeilen, spalten; public MosaikModel(int zeilen, int spalten){ this.zeilen = zeilen; this.spalten = spalten; mObjects = new MosaikIF [zeilen][spalten]; } public void switchNachbarn(int zeile, int spalte){ //erste Zeile: Mitte, links, rechts if(zeile-1 >= 0){ invert(zeile-1, spalte); if (spalte-1 >= 0) invert(zeile-1, spalte-1); if (spalte+1 < spalten) invert(zeile-1, spalte+1); } //zweite Zeile: links, rechts if (spalte-1 >= 0) invert(zeile, spalte-1); if (spalte+1 < spalten) invert(zeile, spalte+1); //dritte Zeile: Mitte, links, rechts if (zeile+1 < zeilen){ invert(zeile+1, spalte); if (spalte-1 >= 0) invert(zeile+1, spalte-1); if (spalte+1 < spalten) invert(zeile+1, spalte+1); } } public void switchSeite(int zeile, int spalte){ invert(zeile, spalte); } //bewirkt das Umdrehen der anzugebenen Seite private void invert(int zeile, int spalte){ getMObj(zeile, spalte).switchSeite(); } public void putMObj(int zeile, int spalte, MosaikIF mObj){ mObjects [zeile][spalte] = mObj; } public MosaikIF getMObj(int zeile, int spalte){ return mObjects [zeile][spalte]; } public void action(int zeile, int spalte){ switchNachbarn(zeile, spalte); //switchSeite(zeile, spalte); // für das Protokoll-Fenster } } ModelIF (Interface-Klasse) ----------------------------------------------------- public interface ModelIF{ public void action(int zeile, int spalte); public void putMObj(int zeile, int spalte, MosaikIF mObj); public MosaikIF getMObj(int zeile, int spalte); } MosaikCanvas.java ---------------------------------------------------- import java.awt.*; /** * Die Komponente simuliert eine Spielkarte mit * unterschiedlich eingefärbten Vorder- und Rückseiten. * Mehrere Objekte dieser Komponente können zu einem * Mosaik-Spiel aggregiert werden. * Ein Farbwechsel suggeriert das Umdrehen der Karte. */ public class MosaikCanvas extends Canvas implements MosaikIF{ //Farben für die Vor- und Rückseite bestimmen private Color farbe, farbeRueck, farbeVor; //Farbwerte public Color getFarbe(){ return farbe; } public void setFarbe(Color inValue){ farbe = inValue; } //Seiten bestimmen private boolean seite; //true für Vorder-, false für Rückseite public boolean getSeite(){ return seite; } public void setSeite(boolean inValue){ seite = inValue; } //Zeile bzw. Spalte private int zeile, spalte; //gibt auskunft, welche Zelle angeklickt wurde public int getZeile(){ return zeile; } public void setZeile(int inValue){ zeile = inValue; } public int getSpalte(){ return spalte; } public void setSpalte(int inValue){ spalte = inValue; } /** * Initialisiert ein Objekt unter Angabe der Lage in * einem Containerraster bei Festlegung von Vorder- * und Rückseitenfarbe. Der einbettende Container * sollte ein GridLayout verwenden. * @param zeile Nummer der <i>Zeile</i> im Container * @param spalte Nummer der <i>Spalte</i> im Container * @param farbeRueck Color-Object zur Einfärbung der Rückseite * @param farbeVor Color-Object zum Einfärben der Vorderseite */ public MosaikCanvas(int zeile, int spalte, Color farbeRueck, Color farbeVor){ this.zeile = zeile; this.spalte = spalte; this.farbeRueck = farbeRueck; this.farbeVor = farbeVor; setSeite(false); //default-Wert setFarbe(farbeRueck); //default-Wert } /** * Wechselt die Einfärbung der Komponente, so dass ein * Umdrehen einer Karte suggeriert wird. Gewechselt wird * zwischen zwei Farben, die im Konstruktor zu setzen sind. * @see #MosaikCanvas */ public void switchSeite(){ seite =! seite; farbe =(farbe == farbeRueck)? farbeVor : farbeRueck; repaint(); } //Objekte für Doubblebuffering private Graphics grOffScreen; private Image imageOffScreen; public void paint(Graphics g){ if (grOffScreen == null) createOffScreenImage(); grOffScreen.setColor(getFarbe()); grOffScreen.fillRect(0, 0, getSize().width, getSize().height); //auf die Bildkomponente zeichnen g.drawImage(imageOffScreen, 0, 0, this); } public void update(Graphics g){ paint(g); } public void createOffScreenImage(){ imageOffScreen = createImage(getSize().width, getSize().width); grOffScreen = imageOffScreen.getGraphics(); } } vielleicht kannst du mir eine Anregung geben an welcher Stelle das Einbauen des Protokollfensters sinnvoll ist und wie man im MosaikEventHandler auf das Canvas-Objekt im Protokollfenster zugreifen kann. |
|
|
|
![]() |
| Lesezeichen |
| Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
| Themen-Optionen | |
|
|
Ähnliche Themen
|
||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| Java Applet soll Daten an ein PHP Script senden | flanger | Allgemeine Java-Programmierung | 5 | 16.05.2007 16:52 |
| Policy Datei für Applet konfigurieren | bobcho | Desktop-Applikationen und Grafik | 14 | 28.06.2005 21:59 |
| Applet korrekt einbinden | bicpi | Allgemeine Java-Programmierung | 1 | 15.01.2005 06:13 |
| 2 Applet miteinander kommunizieren | mr.no | Allgemeine Java-Programmierung | 3 | 23.11.2004 20:47 |
| Auf ein Canvas Objekt per Mouseevents Linien Zeichnen | schärple | Desktop-Applikationen und Grafik | 6 | 12.06.2004 17:42 |