MouseEvent abfangen

Status
Nicht offen für weitere Antworten.

Haefel

Mitglied
Hallo,

bin noch ein Anfänge in Java daher seid mir nicht böse wenn ich nicht so korrekte Aussagen mache!

Also ich habe folgendes Problem:

Ich habe ein Applet mit Canvas Objekten(so ne Art Magischer Würfel) in dem die Canvas Objekte auf bzw. wieder zugedeckt werden können! So weit so gut funktioniert auch alles super! Jetzt muss ich aber
einen zusätzlichen Protokollframe programmieren der beim aufdecken eines Canvas Objekte im Applet das identische Canvas Objekt im Frame aufdeckt. Habe eine Model Klasse erstellt die das nötige Verhalten aufweist!
Jetzt habe ich aber das Problem dass ich eine Event Handler Klasse habe und ich es nicht hinbekomme, die Model Klasse bei diesem anzumelden!

Wäre echt nett wenn mir jemand von euch einen kleinen Tipp geben könnte! :bahnhof:


Hier die Event Handler Klasse
Java:
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.lang.Object;
import java.util.*;

public class MosaikEventHandler implements MouseListener{


       Hashtable modelTable;
       Object key;
       StatistikModel sm;


       public MosaikEventHandler(ModelIF mosaikModel){

              modelTable = new Hashtable();
              addModel(mosaikModel);

       }
       
       public void setMosaikModelFrame(MosaikModelFrame mosaikModelFrame) {
              modelTable = new Hashtable();
              addModelFrame(mosaikModelFrame);
       }

       private int intZeile, intSpalte;

       public void mouseReleased(MouseEvent me){
             intZeile = ((MosaikIF)me.getSource()).getZeile();
             intSpalte =((MosaikIF)me.getSource()).getSpalte();

             Enumeration enum = modelTable.keys();
             while(enum.hasMoreElements()){
               key = enum.nextElement();
               ((ModelIF)modelTable.get(key)).action(intZeile, intSpalte);
               ((MosaikModelFrame)modelTable.get(key)).action(intZeile, intSpalte);

             }
       }


       public void addModel(ModelIF mosaikModel){
           key = new Integer(mosaikModel.hashCode());
           modelTable.put(key, mosaikModel);
       };
       public ModelIF removeModel(ModelIF mosaikModel){
           key = new Integer(mosaikModel.hashCode());
           return (ModelIF)modelTable.remove(key);
       };
       
       public void addModelFrame(MosaikModelFrame mosaikModelFrame){
           key = new Integer(mosaikModelFrame.hashCode());
           modelTable.put(key, mosaikModelFrame);
       };
       
       public MosaikModelFrame removeModelFrame(MosaikModelFrame mosaikModelFrame){
           key = new Integer(mosaikModelFrame.hashCode());
           return (MosaikModelFrame)modelTable.remove(key);
       };

       public void mouseClicked(MouseEvent me){}
       public void mouseEntered(MouseEvent me){}
       public void mouseExited(MouseEvent me){}
       public void mousePressed(MouseEvent me){}
}

Frame
Java:
public class MosaikFrame extends Frame{


  private ModelIF mosaikModel;
  private MosaikModelFrame mosaikModelFrame;
  private MosaikCanvas mc;
  private MosaikEventHandler mosaikEventHandler;




  private Color farbe, farbeRueckseite, farbeVorderseite;
  private int intZeile, intSpalte;



  public MosaikEventHandler getEventHandler() {
    return mosaikEventHandler;
  }



// Konstruktor

    public MosaikFrame (String title,int raster, int breite,Color farbeRueckseite, Color farbeVorderseite, MosaikEventHandler meref){
        super (title);
        setSize (350,450);                              // die Grösse des Frames setzen
        setVisible(true);
        this.setLocation(500,10);
        


        mosaikModelFrame = new MosaikModelFrame(raster,raster);

        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(raster, raster, farbeRueckseite, farbeVorderseite);

                mosaikModelFrame.putObj(i,j,mc);

                mc.setSize(canvasBreite, canvasBreite);
                this.add(mc);

            }
        }
        
    }

}

Gruß Haefel
 
[Java]
componentName.addMouseListener(new MosaikEventHandler(...));
[/Java]

Hast du die entsprechende Methode dafür gesucht oder wie?
 
Hi Icarus2,

ich meine wie ich bei dem Event Handler das Frame Model anmelde und damit dem Frame mitteile, dass er was machen soll wenn sich im Applet was ändert!

Hier die Model Klasse:

Java:
import java.awt.Color;
import java.awt.Canvas;
 //import java.awt.Component;



public class MosaikModelFrame {

private Color farbe, farbeRueckseite, farbeVorderseite;
private MosaikIF[][] mObjects;
private int intZeilen, intSpalten;



         public MosaikModelFrame(int intZeilen,int intSpalten){
              this.intZeilen = intZeilen;
              this.intSpalten = intSpalten;
              mObjects = new MosaikIF[intZeilen][intSpalten];
         }


         public void putObj(int intZeile, int intSpalte, MosaikIF mObj){
                mObjects[intZeile][intSpalte]= mObj;

                System.out.println("Wertevvv:" + mObjects[intZeile][intSpalte]);
         }

         public void action(int intZeile, int intSpalte){
                 System.out.println("Werte:" + mObjects[intZeile][intSpalte]);
                 //this.invert(intZeile, intSpalte);
                 mObjects[intZeile][intSpalte].switchSeite();
                 //mObjects[intZeile][intSpalte].switchSeite();
                 
         }

         public int getSpalte(){return intSpalten;}

         public int getZeile(){return intZeilen;}

         public boolean isVorderseite(){return true;}
 
Hmm, ich verstehe noch nicht ganz. Was soll den am Applet neu gemacht werden? Soll das Applet neu gezeichnet werden?

Weil einen Listener fügt man eigentlich nur einer Component (oder einer Klasse, die Component erweitern) zu. Falls du das Applet neu zeichnen willst, rufe einfach repaint() auf.
 
Hi Icarus2,

vielleicht habe ich mich ein bisschen falsch ausgedrückt!

Also noch mal zu meinem Problem:

Ich habe ein Applet mit einem Raster von Canvas Objekten, welches mit einem klick auf ein Objekt die
angrenzenden Objekte umdreht(Farbe wechselt), funktioniert soweit auch ganz gut! Jetzt soll ich aber aus diesem Applet in Abhängigkeit eines Parameters im param tag einen Frame erzeugen der das gleiche Raster von Canvas Objekten aufweist(funktioniert soweit auch)! Diser HaFrame soll bei einem Klick auf ein Canvas Objekt im Appltet das eigene Canvas Objekt an der selben Position umdrehen/aufdecken!

Mache da jetzt schon zwei Wochen dran rum und bin bald am Verzweifeln! Wenn ich noch Code posten soll dann sag bescheid!;(

Gruß
 
Also, wenn ich das richtig verstanden habe:

Du hast ein Applet und einen Frame, bei dem das gleiche drin ist. Wenn sich beim Applet nach einem Klick etwas ändert, so muss sich das gleiche ändern im Frame?

Ich hätte da schon eine Idee:
Ich nehme an du zeichnest das ganze im Applet auf einen Panel. Du fügst dem Panel einen MouseListener hinzu. Wenn die Maus geklickt wurde, wird die entsprechende MouseListener-Methode aufgerufen.

In dieser musst du anschliessend feststellen welches Objekt gerade geklickt wurde. Du hast ja das Raster in einem 2D-Array gespeichert, wodurch du auch bestimmen kannst, welches Objekt wo auf dem Panel liegt (mit Koordinaten). Im MousListener kannst du, wenn du z.B. mouseRelesed(MouseEvent e) hast, mit e.getX() und e.getY() die Koordinaten bekommen wo geklickt wurde.

Du schreibst anschliessend eine Methode, z.B. updateFrame(...) , in der Klasse, in der du den JFrame erzeugst. Du rufst die updateFrame(...) aus der Methode MouseReleased(...) auf und übergibst die benötigten Parameter.


Ist vielleicht eine etwas komplizierte Erklärung, kannst du etwas damit anfangen?
 
Hi Icarus2,

Genau das ist die Problematik!

Hab ich schon probiert und bekomme entweder eine Class Cast Exception oder eine Null Pointer exeption!
Ich denk mal ich blicks halt einfach nicht!😀

Hier der Applet Code und danach der Code für die Canvas Objekte

Java:
import java.awt.Color;
import java.awt.Image;
import java.awt.Component;

public class Mosaik extends java.applet.Applet implements SteuerIF{
       //private Color farbeRueckseite = new Color(230,30,50);
       private StatistikModel statistik;
       private int intRaster;
       private int intProtokoll;
       private Image image;
       private String strBildName;
       private BildMosaik bm;
       
       private FarbMosaik fm;
       private VorschauCanvas vorschauBild;
       private boolean zuletztBild;
       private boolean bolHerkunft;//##
       private boolean bolFarbMosaik;
       private Color farbeRueckseite;
       private Color farbeVorderseite;
       private Component steuerPanel;
       
       // neuer Code
       private MosaikFrame mosaikFrame;
       
       public void init(){
               // Rasterwert einlesen
               String tmp = getParameter("intRaster");
               try{
                  intRaster = Integer.parseInt(tmp);
               }
               catch(NumberFormatException ne){
                  intRaster = 4;
                  System.out.println("Rasterwert auf default " + intRaster + " gesetzt!");
               }
               
               // Bildname einlesen
               strBildName = getParameter("BildName");
               
               // Protokolloption
               tmp = getParameter("intProtokoll");
               try{
                   intProtokoll = Integer.parseInt(tmp);

               }
               catch(NumberFormatException ne){
                   intProtokoll = 0;
                   System.out.println("Protokollfenster deaktiviert!");
               }
               
               farbeRueckseite = new Color(230,30,50);
               farbeVorderseite = new Color(50, 210, 30);

               image = this.getImage(getCodeBase(), strBildName);

               image = ImageHandler.trackImage(image, this);
               
               //zunächst Vorschaubild anzeigen
               vorschauBild = new VorschauCanvas(image);
               add(vorschauBild);
               steuerPanel = new SteuerPanel(this);
               add(steuerPanel);
               


       }
       
       public void startGame(int intRaster, boolean modus){
              if(vorschauBild != null){
                remove(vorschauBild);
                vorschauBild = null;
              }
              else{
                if(zuletztBild)
                   remove(bm);
                else
                   remove(fm);
              }
              if(modus){
                bm = new BildMosaik(intRaster, farbeRueckseite, image);
                add(bm);
                zuletztBild = true;
                
                //mosaikFrame = new MosaikFrame("Protokollfenster", intRaster, image.getWidth(this), farbeRueckseite, farbeVorderseite, bm);
                
                // Statistik
                statistik = new StatistikModel();
                bm.getEventHandler().addModel(statistik);
              }
              else{
                bolHerkunft = false;

                fm = new FarbMosaik(intRaster, image.getWidth(this), farbeRueckseite, farbeVorderseite); ///####
                add(fm);
                zuletztBild = false;
                
                
                if(intProtokoll != 0){
                  bolFarbMosaik = true;
                  MosaikEventHandler meref;
                  meref = fm.getEventHandler();
                  mosaikFrame = new MosaikFrame("Protokollfenster", intRaster, image.getWidth(this), farbeRueckseite, farbeVorderseite, meref);
                }


                
                // Statistik
                statistik = new StatistikModel();
                fm.getEventHandler().addModel(statistik);
                

              }
              add(steuerPanel);
              validate();
              
              //frameClass = new MosaikFrame("Protokollfenster", intRaster, image.getWidth(this), farbeRueckseite, farbeVorderseite );
              //frameClass.registerParent();
       }
       
       public void resetGame(){
         validate();
         mosaikFrame.setVisible(false);
         //frameClass.destroy();

       }
       
       public void destroy(){
         System.out.println(statistik.getAnzahlVersuche());

       }


}

Java:
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Panel;


public class FarbMosaik extends Panel{
       private ModelIF mosaikModel;
       private MosaikEventHandler mosaikEventHandler;

       public MosaikEventHandler getEventHandler(){
         return mosaikEventHandler;
       }
       
       public FarbMosaik(int intRaster, int intBreite, Color farbeRueckseite, Color farbeVorderseite){
              mosaikModel = new MosaikModel(intRaster,intRaster);
              mosaikEventHandler = new MosaikEventHandler(mosaikModel);
              this.setLayout(new GridLayout(intRaster, intRaster,1,1));
              int canvasBreite = intBreite/intRaster;

              //if(bolHerkunft == false){
                for (int i = 0; i < intRaster; i++){
                  for(int j = 0; j < intRaster; j++){
                      MosaikCanvas mc = new MosaikCanvas(i,j,farbeRueckseite, farbeVorderseite);
                      mc.addMouseListener(mosaikEventHandler);
                      mosaikModel.putObj(i,j,mc);
                      mc.setSize(canvasBreite, canvasBreite);
                      this.add(mc);
                  }
                }    

       }
}

EventHandler

Java:
      public void mouseReleased(MouseEvent me){
             intZeile = ((MosaikIF)me.getSource()).getZeile();
             intSpalte =((MosaikIF)me.getSource()).getSpalte();

             Enumeration enum = modelTable.keys();
             while(enum.hasMoreElements()){
               key = enum.nextElement();
               ((ModelIF)modelTable.get(key)).action(intZeile, intSpalte);
               ((MosaikModelFrame)modelTable.get(key)).action(intZeile, intSpalte);     /// Class Cast Exception

             }
       }

Sorry ist ein haufen Code!
 
Wo bekommst du genau diese beiden Exceptions, also in welcher Zeile?

Noch was:
Hast du für jedes einzelne Mosaik einen eigenen Panel? Wenn ja kanns du auch jedem Panel einen Listener anhängen. Danach kannst du im Listener mit e.getSource() herausfinden, um welches Objekt sich handelt. Dann dieses Objekt übergeben und in der Frame-Klasse vergleichen und schliesslich das zu veränderde Objekt verändern und den Frame neu zeichnen.
 
im EventHandler zeile 9 die Class Cast Exception!

Java:
public void mouseReleased(MouseEvent me){
             intZeile = ((MosaikIF)me.getSource()).getZeile();
             intSpalte =((MosaikIF)me.getSource()).getSpalte();
 
             Enumeration enum = modelTable.keys();
             while(enum.hasMoreElements()){
               key = enum.nextElement();
               ((ModelIF)modelTable.get(key)).action(intZeile, intSpalte);
               ((MosaikModelFrame)modelTable.get(key)).action(intZeile, intSpalte);     /// Class Cast Exception
 
             }
       }

Wenn ich nachfolgendes Versuche bekomme ich die Meldung Array out of bounds:

Java:
public void mouseReleased(MouseEvent me){
             intZeile = ((MosaikIF)me.getSource()).getZeile();
             intSpalte =((MosaikIF)me.getSource()).getSpalte();

             Enumeration enum = modelTable.keys();
             while(enum.hasMoreElements()){
               key = enum.nextElement();
               ((ModelIF)modelTable.get(key)).action(intZeile, intSpalte);
               //((MosaikModelFrame)modelTable.get(key)).action(intZeile, intSpalte);     /// Class Cast Exception

             }
             [COLOR="Red"]MosaikModelFrame mmf;
             mmf.action(intZeile, intSpalte);// Array out of Bounds[/COLOR]
       }

Java:
public void action(int intZeile, int intSpalte){
                 System.out.println("Werte:" + mObjects[intZeile][intSpalte]);
                 //this.invert(intZeile, intSpalte);
                 mObjects[intZeile][intSpalte].switchSeite();
                 //mObjects[intZeile][intSpalte].switchSeite();
                 
         }


Wass ich nur nicht verstehe ist, dass ich ja die korrekte Zeilen/Spaltenangabe in der mouseReleased zur Verfügung habe!

Die switchSeite() - Methode befindet sich in einer anderen Klasse in der ich das vollständige Canvas Raster add'e!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben