MouseListener

kitz

Mitglied
Hallo,

ich hau dann gleich mal meine zweite Frage raus. Ich muss netterweise drei Aufgaben innerhalb von ner Woche für meinen Prof abliefern, wie immer auf den letzten Drücker *grummel*
Anderes Programm, folgender Code:

Java:
import java.awt.*;
import java.awt.event.*;

public class EA4_1 extends Frame {
    private String s = "Mouse-Position: ( 0 | 0 )";
    private String b = "Mouse-Position: ( 0 | 0 )";
        
    EA4_1(String titel) {
        super(titel);
        setSize(400, 400);
        setVisible(true);
        MeinWindowAdapter meinWa = new MeinWindowAdapter();
        addWindowListener(meinWa);
    }

    public void paint (Graphics g) {
        g.drawString(s, 15, 40);
        g.drawString(b, 15, 60);
        g.drawOval(50, 100, 250, 150);
    }

    class MyMouseMotionListener implements MouseMotionListener{

        public void mouseDragged(MouseEvent mE) {
        int x = mE.getX();
        int y = mE.getY();
        b = "Mouse-Position: ( " + x + " |  " + y + " )";
        repaint();
        }

        public void mouseMoved(MouseEvent e) {
        }
    }

    class MyMouseListener extends MouseAdapter {
        public void mousePressed(MouseEvent mE) {
            Graphics g = getGraphics();
        int x = mE.getX();
        int y = mE.getY();
        s = "Mouse-Position: ( " + x + " |  " + y + " )";
        repaint();
        if (mE.isMetaDown()) { //grimmig
               g.drawString("Rechte Maustaste", 50, 100);
            } else {                  //lächeln
               g.drawString("Linke Maustaste", 50, 120);
            }

    }
        
        public void mouseClicked(MouseEvent mE) {}
        public void mouseEntered(MouseEvent mE) {}
        public void mouseExited(MouseEvent mE) {}
        public void mouseReleased(MouseEvent mE) {}
    }

    public void init() {
        addMouseListener(new MyMouseListener());
        addMouseMotionListener((MouseMotionListener) this);
    }

   class MeinWindowAdapter extends WindowAdapter {
       public void windowClosing(WindowEvent e) {
           System.exit(0);
       }
   }
    
    public static void main (String [] args) {
     new EA4_1("EA4_1 MouseListener");
    } 
}

Ich habe so ein ähnliches Programm, allerdings mit Applet und da funzt das.
Nun soll ich mit Frame arbeiten, aber MouseListener funzt net und MotionListener auch nicht.
Und die Unterscheidung welche Maustaste gedrückt wurde auch nicht.
Weiß nicht woran es liegt auch wenn das vielleicht blöde aussieht nu 😳
 
Die init()-Methde fügt zwar die Listener hinzu, allerdings wird die Methode selbst nie aufgerufen...
-> Also den Aufruf init(); in den Konstruktor einfügen
(Ich glaub, du verwechselst Applet, bei den init() aufgerufen wird, und normale Apps, bei denen dies nicht passiert. 🙂)

edit: Und was mir noch grad so auffällt:
Diese Zeile solltest du nochmal überarbeiten:
Java:
addMouseMotionListener((MouseMotionListener) this);
Das hat auch keinen Sinn oder Zweck:
Java:
g.drawString("Rechte Maustaste", 50, 100);
Warum verwendest du kein Swing? Dann könntest du dir sowas sparen:
Java:
class MeinWindowAdapter extends WindowAdapter {
       public void windowClosing(WindowEvent e) {
           System.exit(0);
       }
   }
Du brauchst keine leeren Methoden implementieren, wenn du eine Klasse erweiterst:
Java:
public void mouseClicked(MouseEvent mE) {}
        public void mouseEntered(MouseEvent mE) {}
        public void mouseExited(MouseEvent mE) {}
        public void mouseReleased(MouseEvent mE) {}
-> kann gelöscht werden
 
Zuletzt bearbeitet:
wieso, mit der zeile sage ich ihm doch wenn ich die rechte maustaste benutze soll er mir das auswerfen und das macht er auch...

Java:
g.drawString("Rechte Maustaste", 50, 100);

und ja, der mouselistener funktioniert nun, danke 😉
bei dem motion merke ich dass was falsch ist, aber ich sehe noch nicht was... vielleicht kommt die erleuchtung ja gleich noch bei mir...
 
fehler selber gefunden habe.. nun funzt auch der motionlistener 😀

Java:
addMouseMotionListener(new MyMouseMotionListener());
 
Hallo, kleiner Ratschlag mal am Rande wie schon mein Vorgänger geschrieben hatte.

Java:
 class MyMouseMotionListener implements MouseMotionListener{

Kannst du dir sparen. Einfach den MouseMotionListener auf die obere Klasse. Du musst lediglich die Oberklasse von extends Frame auf extends JFrame.

Java:
        public void mousePressed(MouseEvent mE) {
            Graphics g = getGraphics();
        int x = mE.getX();
        int y = mE.getY();
        s = "Mouse-Position: ( " + x + " |  " + y + " )";
        repaint();
        if (mE.isMetaDown()) { //grimmig
               g.drawString("Rechte Maustaste", 50, 100);
            } else {                  //lächeln
               g.drawString("Linke Maustaste", 50, 120);
            }
 
    }

Dies ist nicht gerade die schöne und gute Art mit Graphics g = getGraphics und dann ein g.drawString(...)

Die Graphics sollte man wenn möglich hauptsächlich in den Überschreibenden Methoden von paint usw. verwenden.

Verwende lieber MouseAdapter als MouseListener. Da brauchst du nicht alle Methoden, sondern nur die, die du auch verwendest.
 
Java:
Graphics g = getGraphics();
erstellt ein Graphics-Objekt, und
Java:
g.drawString("Rechte Maustaste", 50, 100);
zeichnet in dieses. Aber du sagst niemals, dass der diese Graphics anzeigen soll! Deshalb dürfte da auch nicht "Rechte Maustaste" oder "Linke Maustaste" auf dem Bildschirm stehen!
 
da steht aber linke oder rechte Maustaste 😉 das zeigt er mir an beim Klicken

Ich arbeite mit awt weil ich damit vom Studium aus gewohnt bin mit zu arbeiten

achso und das mit dem MouseListener ist so in der Aufgabe vorgegeben, da kann ich nix dran ändern das so zu basteln

Java:
class MyMouseMotionListener implements MouseMotionListener{
 
Zuletzt bearbeitet:
Ahhh sorry, ich hab mich verlesen:
Da steht ja "getGraphics()" und nicht "new Graphics()". 😳

Aber trotzdem sollte man alle Zeichnungen in der paint-Methode vornehmen, und zwar mit dem dort übergebenen Graphics-Objekt. Aber wenn's denn funktioniert...
 
Hmja, es funktioniert vielleicht jetzt und auf diesem PC. Aber das getGraphics ist ein beliebter Fehler. Wenn hier jemand einen Thread startet, in dem es dem Titel nach um Zeichenprobleme geht, lese ich den Code erstmal nicht, sondern starte erstmal mit STRG+F eine Suche nach "getGraphics", und wenn es vorkommt (schaue ich noch, ob das auch nicht auf einem BufferedImage gemacht wird und) schreibe ich die übliche Leier: NUR von der paint/paintComponent-Methode aus malen!

EDIT: Wo wir gerade beim Thema sind: http://www.java-forum.org/awt-swing-swt/102373-jpanel-zeichnung-verschwindet.html 😀
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben