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
 

icarus2

Top Contributor
[Java]
componentName.addMouseListener(new MosaikEventHandler(...));
[/Java]

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

Haefel

Mitglied
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;}
 

icarus2

Top Contributor
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.
 

Haefel

Mitglied
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ß
 

icarus2

Top Contributor
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?
 

Haefel

Mitglied
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!:D

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!
 

icarus2

Top Contributor
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.
 

Haefel

Mitglied
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.
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Java Klassen "Graphics" und "MouseEvent" kombinieren Java Basics - Anfänger-Themen 7
Y MVC MouseEvent Verständnis Java Basics - Anfänger-Themen 24
A Difference between MouseEvent and ActionEvent Java Basics - Anfänger-Themen 5
X JTable in JPanel in JTabbedPane mouseevent von jtable kommt nicht durch Java Basics - Anfänger-Themen 3
Spin MouseEvent Java Basics - Anfänger-Themen 3
N Mit MouseEvent und JComponent Elementnamen bekommen Java Basics - Anfänger-Themen 5
I MouseEvent feuern Java Basics - Anfänger-Themen 7
Dimax SizeLimitExceededException abfangen Java Basics - Anfänger-Themen 6
frager2345 Warum muss ich hier im Konstruktor meine Exeption nicht abfangen ? Java Basics - Anfänger-Themen 4
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
T Eigene Exception - ohne werfen abfangen Java Basics - Anfänger-Themen 2
K falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
Kirby.exe Alle möglichen Error Möglichkeiten abfangen Java Basics - Anfänger-Themen 33
F Mehrere Exceptions in einem Catch-Block abfangen Java Basics - Anfänger-Themen 12
D Wie kann man eine solche Fehlermeldung abfangen Java Basics - Anfänger-Themen 4
W Exception in Main abfangen oder in der Methode? Java Basics - Anfänger-Themen 10
L Erste Schritte IndexOutOfBounce abfangen? Java Basics - Anfänger-Themen 17
M GUI - Fehler abfangen beim Dividieren Java Basics - Anfänger-Themen 8
J Fehler abfangen mit einer Bedingung Java Basics - Anfänger-Themen 3
B Erste Schritte Abfangen eines Fehlers/Ausbrechen aus der Schleife Java Basics - Anfänger-Themen 12
W In einer Function<Double, Double> undefinierte Rechenoperationen abfangen? Java Basics - Anfänger-Themen 3
D Input/Output Runtime().exec fehler abfangen Java Basics - Anfänger-Themen 4
A Int Eingabe: String mit Exception abfangen. Aber wie? Java Basics - Anfänger-Themen 3
P Variablen Abfangen von eingaben per java.util.Scanner und weiter Verarbeitung Java Basics - Anfänger-Themen 7
S java tastendrücke direkt abfangen und printen Java Basics - Anfänger-Themen 3
H Fehler im Konstruktor abfangen Java Basics - Anfänger-Themen 10
OnDemand Exception Abfangen Java Basics - Anfänger-Themen 5
T Division durch 0 abfangen mit Schleife Java Basics - Anfänger-Themen 4
B Erste Schritte Integer Eingabe über Scanner mit Abfangen von Eingabefehlern Java Basics - Anfänger-Themen 3
H Wie kann ich STRG+V abfangen und ändern Java Basics - Anfänger-Themen 2
B Exception abfangen Java Basics - Anfänger-Themen 33
D [jni] loadLibrary Exception abfangen Java Basics - Anfänger-Themen 9
M Windows Aktionen abfangen Java Basics - Anfänger-Themen 3
W Tastatureingabe abfangen Java Basics - Anfänger-Themen 15
S Exception abfangen Java Basics - Anfänger-Themen 2
N Fehlerquelle leere ArrayList elegant abfangen Java Basics - Anfänger-Themen 3
J Standard Exceptions abfangen Java Basics - Anfänger-Themen 5
M Datentypen Fehler abfangen Java Basics - Anfänger-Themen 5
J Eclipse Console Ausgaben Abfangen Java Basics - Anfänger-Themen 2
sylo Warnings abfangen Java Basics - Anfänger-Themen 2
F Falscheingabe abfangen - Endlosschleife Java Basics - Anfänger-Themen 5
A Exception Verständnisfrage: Exceptions während, einer Statischenzuweisung abfangen Java Basics - Anfänger-Themen 10
Spin Exception abfangen Java Basics - Anfänger-Themen 3
M Frage zum Abfangen ungültiger Werte Java Basics - Anfänger-Themen 9
I Fehlendes Argument in Main-Methode abfangen Java Basics - Anfänger-Themen 15
N Probleme beim abfangen von fehlern Java Basics - Anfänger-Themen 4
A FileNotFoundException abfangen? Java Basics - Anfänger-Themen 3
H Falsche Eingabe über try-catch abfangen Java Basics - Anfänger-Themen 2
Spin Abfangen von Fehlern Java Basics - Anfänger-Themen 9
M Exception abfangen? Java Basics - Anfänger-Themen 3
G Eine exception mit negativen zahlen abfangen ? Java Basics - Anfänger-Themen 11
I Dialog - "Ja" / "Nein" abfangen Java Basics - Anfänger-Themen 3
G SQLServerException abfangen Java Basics - Anfänger-Themen 2
C alle möglichen Datumseingaben im Textfeld abfangen Java Basics - Anfänger-Themen 12
G Enter Taste abfangen Java Basics - Anfänger-Themen 11
M Abfangen von java.lang.NumberFormatException Java Basics - Anfänger-Themen 6
T String: NeueZeile (" ") , Break etc. abfangen Java Basics - Anfänger-Themen 2
B Programm würft Exception, kann sie aber nicht abfangen! Java Basics - Anfänger-Themen 25
M Exceptions bei Textfeldern abfangen Java Basics - Anfänger-Themen 2
M JOptionPane.OK_OPTION abfangen oder disablen? Wie? Java Basics - Anfänger-Themen 3
M jToggleButton Klick abfangen ohne den Button zu deaktivieren Java Basics - Anfänger-Themen 2
B Tastatur abfangen Java Basics - Anfänger-Themen 11
U Pfeiltasten abfangen Java Basics - Anfänger-Themen 2
B Ausnahmen abfangen Java Basics - Anfänger-Themen 3
C Benutzereingaben vor Listener abfangen Java Basics - Anfänger-Themen 5
I InputStream von Konsole abfangen Java Basics - Anfänger-Themen 6
O allgemeine Exceptions abfangen Java Basics - Anfänger-Themen 17
P Auswahl von JComboBox abfangen Java Basics - Anfänger-Themen 3
T jcombobox, item-selektierung abfangen Java Basics - Anfänger-Themen 5
F Fehler beim Schreiben wenn Datei schreibgeschützt abfangen Java Basics - Anfänger-Themen 6
C System.out.println "abfangen"? Java Basics - Anfänger-Themen 8
rambozola selbst definierte exception abfangen funzt nicht Java Basics - Anfänger-Themen 14
S von CommandLine übergebene Parameter abfangen? Java Basics - Anfänger-Themen 12
V Mausklick mit rechter Taste abfangen? Java Basics - Anfänger-Themen 8
C falsche Eingabe abfangen Java Basics - Anfänger-Themen 8
L GUI - Tastaturereignisse abfangen ohne Fokus? Java Basics - Anfänger-Themen 8
D Frage zum abfangen von Exceptions Java Basics - Anfänger-Themen 5
V JOP.showInputDialog Abbrechen Button, Exception abfangen Java Basics - Anfänger-Themen 2
W MouseListener Probleme beim Abfangen Java Basics - Anfänger-Themen 8
F Exception in while-Schleife abfangen? Java Basics - Anfänger-Themen 2
F 2 numberformatexception abfangen? Java Basics - Anfänger-Themen 20
ven000m Exception abfangen Java Basics - Anfänger-Themen 9
H JTabel Selectionen abfangen Java Basics - Anfänger-Themen 2
L Java App + Exception abfangen Java Basics - Anfänger-Themen 2
G Fehler abfangen Java Basics - Anfänger-Themen 2
D Falscheingaben abfangen Java Basics - Anfänger-Themen 8
M Negative Werte abfangen Java Basics - Anfänger-Themen 18
G Abfangen von Falscheingaben Java Basics - Anfänger-Themen 4
C Exception abfangen->Klappt nicht ;( Java Basics - Anfänger-Themen 2
S Division durch null abfangen :freak: Java Basics - Anfänger-Themen 14
EagleEye Exception abfangen Java Basics - Anfänger-Themen 15

Ähnliche Java Themen

Neue Themen


Oben