tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
22
ZUGRIFFE
2367
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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.
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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);)
     

  3. #3
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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.
     

  4. #4
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.)
     

  5. #5
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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);
        }
    }
     

  6. #6
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Scheinst du doch gemacht zu haben. Wo genau tritt der Fehler auf?
    btw. man verwendet statt *.show() *.setVisible(boolean).
     

  7. #7
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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();
            }
     

  8. #8
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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;
                }
            }
        }
     

  9. #9
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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
     

  10. #10
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.
     

  11. #11
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    Danke für die Geduld und die Mühe. Werde dies morgen einmal testen und dir eine Rückmeldung geben.
     

  12. #12
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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
     

  13. #13
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    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.)
     

  14. #14
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    Ich arbeite mit dem TextPad-Editor 5.2.0 und compiliere mit j2sdk1.4.2_01
     

  15. #15
    bueko bueko ist offline Mitglied
    Registriert seit
    Feb 2009
    Beiträge
    14
    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

  1. Ein Frame im Applet öffnen
    Von crazymoose im Forum Java
    Antworten: 3
    Letzter Beitrag: 19.06.08, 09:30
  2. Neues Frame aus Applet
    Von hammurabi79 im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 19.09.07, 22:52
  3. Mausklick aufgrund von Koordinaten aus einer INI Datei ausführen
    Von ::emanuel:: im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 01.12.06, 17:35
  4. Antworten: 1
    Letzter Beitrag: 13.06.05, 15:13
  5. Java Applet-Menü im Frame - wie aufs nächste Frame verweisen?
    Von sunshineworld im Forum HTML & XHTML
    Antworten: 3
    Letzter Beitrag: 31.01.02, 22:56

Stichworte