Swing JApplet: Problem MouseListener Anmeldung

Semox

Bekanntes Mitglied
Liebes Forum

Sorry wenn ich Euch mit sowas belästige. Ich verstehe nicht warum sich die Linie nicht per zwei aufeinanderfolgenden Klicks darstellen läßt. Ich habe einen anonymen MouseListener geschrieben, jedoch verstehe ich nicht ganz warum der nicht aktiv wird. Wie kann ich das richtig machen? :bahnhof:

Java:
import javax.swing.JApplet;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import java.awt.Graphics;

public class MyApplet extends JApplet {

	private static final long serialVersionUID = 4499262829190730857L;
	private int x1, y1, x2, y2;
	private int clicked = 0;

	class MyListener extends MouseAdapter {

		public MyListener() {
			MyListener myListener = new MyListener();
			addMouseListener(myListener);
			addMouseMotionListener(myListener);
		}

		public void mouseClicked(MouseEvent mE) {
			if (clicked % 2 == 1) {
				x1 = mE.getX();
				y1 = mE.getY();
				System.out.println("x1:" + x1 + " " + "y1: " + y1);
				clicked++;
			} else {
				x2 = mE.getX();
				y2 = mE.getY();
				System.out.println("x2:" + x2 + " " + "y2: " + y2);
				clicked++;
				repaint();
			}
		}
	}
	
	public void paint(Graphics g) {
		// super.paint(g);
		g.clearRect(0, 0, 320, 240);
		g.drawOval(20, 20, 100, 80);
		g.setColor(Color.MAGENTA);
		g.drawLine(x1, y1, x2, y2);

	}
}

Ich würde mich wirklich freuen, wenn Ihr mir helfen könntet. Vielen Dank.

Beste Grüße,
Semo
 
Das was du da machst, macht keinen Sinn 😀
a) innerhalb des Konstruktors von MyListener noch eine Instanz von MyListener zu erstellen
b) der Konstruktor(quasi der erste Aufruf*g*) wird ja gar nicht aufgerufen.

In einem Applet kannst du die init-Methode benutzen.
Versuchs mal so:
Java:
import javax.swing.JApplet;
 
public class MyApplet extends JApplet {
 
    private static final long serialVersionUID = 4499262829190730857L;
    private int x1, y1, x2, y2;
    private int clicked = 0;
 
    @Override
    public void init() {
    	new MyListener();   // <-------
    }
    
    
    class MyListener extends MouseAdapter {
 
        public MyListener() {
            addMouseListener(this);  
            addMouseMotionListener(this);
        }
 
        @Override
		public void mouseClicked(MouseEvent mE) {
            if (clicked % 2 == 1) {
                x1 = mE.getX();
                y1 = mE.getY();
                System.out.println("x1:" + x1 + " " + "y1: " + y1);
                clicked++;
            } else {
                x2 = mE.getX();
                y2 = mE.getY();
                System.out.println("x2:" + x2 + " " + "y2: " + y2);
                clicked++;
                repaint();
            }
        }
    }
    
    @Override
	public void paint(Graphics g) {
        // super.paint(g);
        g.clearRect(0, 0, 320, 240);
        g.drawOval(20, 20, 100, 80);
        g.setColor(Color.MAGENTA);
        g.drawLine(x1, y1, x2, y2);
 
    }
}
 
Hallo eRaaaa

Dankeschön. Warum brauche ich kein Objekt, sondern kann den addMousListener direkt per this implementieren? Es funktioniert, aber ich habe nicht ganz verstanden warum.

Viele Grüße,
Semo
 
Naja eine Instanz brauchst du schon. Dein Fehler war einfach, dass du das add.. an falscher Stelle aufgerufne hast. Du könntest natürlich auch den Code, der in deinem alten Code im KOnstruktor von MyListener steht, 1:1 in die init Methode kopieren, das sollte genau so funktionieren und macht die Sache für dich evtl. verständlicher. Also
Java:
    @Override
    public void init() {
              MyListener myListener = new MyListener();
            addMouseListener(myListener);
            addMouseMotionListener(myListener);
    }

Dein Problem war einfach, dass du nirgends eine Instanz erstellt hattest von MyListener (ausser eben im Konstruktor von MyListener, was ja aber keinen Sinn macht, da der ja nur aufgerufen wird wenn du eine Instanz erstellst ... 😀 )

Vllt. wird es auch noch deutlicher, wenn du in deinem alten Code mal nach der Zeile 15 ein System.out rein machst, dann wirst du sehen, dass dieser gar nicht aufgerufen wurde.

Hoffe das war jetzt etwas deutlicher(sorry, war vorhin nebenbei am Pokern mit den Leuten aus dem Chat *g*)
 

Neue Themen


Zurück
Oben