ERLEDIGT
JA
JA
ANTWORTEN
22
22
ZUGRIFFE
2367
2367
EMPFEHLEN
-
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.
-
03.02.09 22:01 #2
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.
-
03.02.09 22:37 #4
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 :
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 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
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 :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 45 46 47
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 :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 45 46 47
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); } }
-
03.02.09 22:53 #6
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 :1 2 3 4
// Methode public void umdrehenKarten() { this.mc.switchSeite(); }
at Mosaik.startGame(Mosaik.java:87)
Code :1 2 3 4 5 6 7 8 9 10
// 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(); }
-
03.02.09 23:15 #8
Nein, hast du doch nicht.
Code java:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
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.Geändert von bueko (03.02.09 um 23:25 Uhr) Grund: Rechtschreibung
-
03.02.09 23:49 #10
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:
Code java: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
// 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.
-
Danke für die Geduld und die Mühe. Werde dies morgen einmal testen und dir eine Rückmeldung geben.
-
Leider werden Fehler ausgegeben, die ich mir nicht erklären kann.
Code :1 2 3 4 5 6 7 8 9 10 11
MosaikFrame.java:27: '(' or '[' expected ArrayList<MosaikCanvas> mosaikCanvasList = new ArrayList<MosaikC anvas>(); ^ MosaikFrame.java:50: ';' expected for(MosaikCanvas mc:this.mosaikCanvasList) { ^ MosaikFrame.java:58: illegal start of expression } ^ 3 errors
-
04.02.09 15:48 #13
Arbeitest du event. in einer (sehr) alten Version in der es noch keine extends fors oder generiken Typen gibt? (Würde auch das *.show erklären.)
-
Ich arbeite mit dem TextPad-Editor 5.2.0 und compiliere mit j2sdk1.4.2_01
-
Ich habe die generics jetzt weggelassen und siehe da, es existiert noch der Fehler in der for-Schleife und die expression.
Code :1 2 3 4 5 6 7
MosaikFrame.java:50: ';' expected for(MosaikCanvas mc:this.mosaikCanvasList) { ^ MosaikFrame.java:58: illegal start of expression } ^ 2 errors
Ähnliche Themen
-
Ein Frame im Applet öffnen
Von crazymoose im Forum JavaAntworten: 3Letzter Beitrag: 19.06.08, 09:30 -
Neues Frame aus Applet
Von hammurabi79 im Forum Swing, Java2D/3D, SWT, JFaceAntworten: 0Letzter Beitrag: 19.09.07, 22:52 -
Mausklick aufgrund von Koordinaten aus einer INI Datei ausführen
Von ::emanuel:: im Forum Visual Basic 6.0Antworten: 1Letzter Beitrag: 01.12.06, 17:35 -
Per Mausklick Programm ausführen (ohne download)
Von Kai-Behncke im Forum PHPAntworten: 1Letzter Beitrag: 13.06.05, 15:13 -
Java Applet-Menü im Frame - wie aufs nächste Frame verweisen?
Von sunshineworld im Forum HTML & XHTMLAntworten: 3Letzter Beitrag: 31.01.02, 22:56





Zitieren
Login





