Impressum · Kontakt · Hilfe
Besucher online · Mitglieder



Portal > Foren > Java > Allgemeine Java-Programmierung > Applet mit Canvas-Objekt
Antwort
 
Themen-Optionen
Alt 13.10.2005, 00:41   Nach oben    #1
Carsten
Neuer Benutzer
 
Registriert seit: 13.10.2005
Beiträge: 5
Standard Applet mit Canvas-Objekt

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!
Carsten ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 13.10.2005, 19:45   Nach oben    #2
sparrow
Sesselkleber
 
Benutzerbild von sparrow
 
Registriert seit: 17.01.2005
Beiträge: 567
Standard

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:
// In deiner Hauptklasse irgendwo
Frame frame = new Frame("childframe");
frame.canvas.dieMethode des Canvas(); 
Natürlich muss dann in frame auch das Objekt canvas bestehen.
sparrow ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.10.2005, 11:44   Nach oben    #3
Carsten
Neuer Benutzer
 
Registriert seit: 13.10.2005
Beiträge: 5
Standard

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)
Carsten ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 16.10.2005, 11:44   Nach oben    #4
Carsten
Neuer Benutzer
 
Registriert seit: 13.10.2005
Beiträge: 5
Standard

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.
Carsten ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.
Trackbacks are An
Pingbacks are An
Refbacks are Aus

Ä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


Alle Zeitangaben in WEZ +2. Es ist jetzt 23:23 Uhr.

Nach oben
Wir nutzen das Zend Framework, vBulletin (vBulletin v3.7.2, Copyright ©2000-2008, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.0.0) und vBSEO.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44