Java Mouselistener :confused

plusnoir

Cadet 3rd Year
Registriert
Apr. 2009
Beiträge
36
Hallo zusammen!!

Folgendes. Ich möchte eine Java-Application implementieren die folgendes tut. Wenn ich über das Canvas also die Fläche im Fenster drüberfahr, klicke, Maustaste loslasse u.ä. soll sich die Hintergrundfarbe des Fensters ändern.

Bis jetzt hab ich folgendes geschrieben:

Code:
package Malprogramm;

import java.awt.*;
import java.awt.event.*;

public class Chameleon extends Frame implements MouseListener {

	Canvas c = new Canvas();

	public Chameleon(String title) {

		super(title);

		c.setBackground(new Color(0, 0, 0));

		add(c, BorderLayout.CENTER);

		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			public void windowIconified(WindowEvent e) {
				System.out.println("down down down down");
				;
			}
		}

		);

		c.setSize(500, 200);
		pack();
		setLocation(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {

		new Chameleon("HOMOLORD");

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}

}


So weit Das Fenster selbst. Nun möchte ich aber wirklich einen MouseListener implementieren. Leider ist es mir nicht gelungen im internet ein Beispiel zu finden wo ein Mouselistener in einer Application implementiert wird, nur in Applets.

Und das sieht dan ca. so aus:

Code:
	this.addWindowListener
		(
		new WindowAdapter()
		{
		public void mouseReleased(MouseEvent e)
		{
		c.setBackground(Color.red);
		}

		public void mousePressed(MouseEvent e)
		{
		c.setBackground(Color.green);
		}
		public void mouseEntered(MouseEvent e)
		{
		c.setBackground(Color.blue);
		System.out.print("SELBER NERD!!");
		}
		public void mouseExited(MouseEvent e)
		{
			c.setBackground(Color.green);
		}
		public void mouseClicked(MouseEvent e) {
			c.setBackground(Color.pink);
		}
		}
		
		);

Also meine frage ist es überhaupt möglich so wie ich mir das vorstelle?! Wenn ja, wie?!

Wäre für eure Hilfe sehr Dankbar!

Gruß plusnoir :D
 
this.addMouseListener(this);

Den MouseListener solltest du aber lieber als anonymous inner Class deklarieren, also:
this.addMouseListener(new MouseListener() {...});
 
Ok vielen Dank!

hab das so gemacht.

Code:
package Malprogramm;

import java.awt.*;
import java.awt.event.*;

public class Chameleon extends Frame implements MouseListener {

	Canvas c = new Canvas();

	public Chameleon(String title) {

		super(title);

		c.setBackground(new Color(0, 0, 0));

		add(c, BorderLayout.CENTER);

		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			public void windowIconified(WindowEvent e) {
				System.out.println("down down down down");
				;
			}

		}

		);

		c.addMouseListener(new MouseListener() {

			@Override
			public void mouseClicked(MouseEvent e) {
				c.setBackground(Color.red);

			}

			@Override
			public void mouseEntered(MouseEvent e) {
				c.setBackground(Color.green);

			}

			@Override
			public void mouseExited(MouseEvent e) {
				c.setBackground(Color.blue);

			}

			@Override
			public void mousePressed(MouseEvent e) {
				c.setBackground(Color.orange);

			}

			@Override
			public void mouseReleased(MouseEvent e) {
				c.setBackground(Color.green);

			}
		});

		c.setSize(500, 200);
		pack();
		setLocation(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {

		new Chameleon("HOMOLORD");

	}

	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub

	}

	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub

	}

}

und es funktioniert.

Thx a lot. :daumen:
 
Zuletzt bearbeitet: (problem gelöst)
du musst nicht mehr MouseListener implementieren...

so wäre es richitg
PHP:
package Malprogramm;

import java.awt.*;
import java.awt.event.*;

public class Chameleon extends Frame {
	Canvas c = new Canvas();

	public Chameleon(String title) {

		super(title);

		c.setBackground(new Color(0, 0, 0));

		add(c, BorderLayout.CENTER);

		this.addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}

			public void windowIconified(WindowEvent e) {
				System.out.println("down down down down");
				;
			}

		}

		);

		c.addMouseListener(new MouseListener() {

			@Override
			public void mouseClicked(MouseEvent e) {
				c.setBackground(Color.red);

			}

			@Override
			public void mouseEntered(MouseEvent e) {
				c.setBackground(Color.green);

			}

			@Override
			public void mouseExited(MouseEvent e) {
				c.setBackground(Color.blue);

			}

			@Override
			public void mousePressed(MouseEvent e) {
				c.setBackground(Color.orange);

			}

			@Override
			public void mouseReleased(MouseEvent e) {
				c.setBackground(Color.green);

			}
		});

		c.setSize(500, 200);
		pack();
		setLocation(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {

		new Chameleon("HOMOLORD");
	}
}

gruss krizi
 
Kleiner Tip zum Programmierstil:
Dein Konstruktor sieht nun ziemlich durcheinander gewürfelt aus. Grundsätzlich solltest du deine Variablen vor dem Konstruktor deklarieren und im Konstruktor dann initialisieren! Ausserdem solltest du im Konstruktor auch nur die Methoden/Listenener zu deinen JComponent-Contents hinzufügen und sie ausserhalb vom Konstruktor "befüllen".
Letzteres ist auch nicht die optimalste Lösung und schon gar nicht nach den Konventionen der Objektorientierung! Wenn du es wirklich objektorientiert gestalten willst, dann spalte deinen komplette Anwendung gemäß dem MVC Pattern auf, also in 3 Komponenten, der Model Komponente, der View Komponente, sowie der Controller Komponente. Das erleichtert ein nachträgliches Editieren des Codes ungemein, da die jeweilige "Schicht" von der anderen weitestgehend getrennt ist/wird.
Wenn du mehr dazu erfahren willst, schau dir entweder in der GoF die Erklärung dazu an oder lies den Wiki Artikel dazu.
 
@ Firestorm.

Ok das hört sich interessant an. Könntest du das vllt erläutern? Oder noch besser an das bisschen Code von oben zeigen.

Wäre dir sehr verbunden.

Und was ist GoF?
 
GoF = Gang of Four. DAS Buch zu Entwurfspattern überhaupt! http://de.wikipedia.org/wiki/Viererbande_(Softwareentwicklung)

Naja viel zu erläutern gibts da nicht. Es ist nunmal ein Prinzip der Objektorientierung möglichst einfache Konstrukte zu kapseln, also so weit wie möglich voneinander zu trennen, um eine spätere Editierung zu erleichtern.

Ein einfaches Beispiel zu MVC findest du hier: http://www.java2s.com/Code/Java/Design-Pattern/MVCPatterninJava2.htm

Erläuterungen zu MVC findest du hier: http://csis.pace.edu/~bergin/mvc/mvcgui.html

Sorry deinen Code umzuschreiben ist mir zu aufwändig. Es geht wie gesagt nur um ein Prinzip (bewährt) der Entwicklung.

Wenn du ein gutes Buch zu Pattern suchst: "Patterns kompakt: Entwurfsmuster für effektive Software-Entwicklung" vom Spektrum Verlag.
 
Zurück
Oben