# Aktion auslösen bei Mausbewegung



## interprogy (23. Apr 2008)

hi,

ich bin ein Java-Neuling. Suche brachte nix. 

das untere soll eine Tabelle ergeben in der die Punkte eines Spiels (Kniffel) geschrieben werden. wenn der Nutzer mit der Maus in den tabellenbereich mit der Maus fährt, sollen die jeweiligen Punkte dort erscheinen.

habe folgendes Problem mit meinem Code, wenn ich die Maus schnell in den Bereich wo die Aktion ausgelöst werden soll hinein bewege funzt es (es wird eine Punktezahl ausgegeben), wenn ich normal langsam mit der Maus in den Bereich hinein gehe passiert nix. Bei public void setzePunkte kommt natürlich noch anderer Code rein, hab aber im Mom das Prob mit der Mausbewegung.

achso: die Mauskoordinaten beziehen sich auf das Objekt Rechteck tab.drawRect( 100, 0, 100, 400);



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

// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++ class SpielTabelle extends Panel implements MouseListener ++
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

class SpielTabelle extends Panel implements MouseListener	{

	Wuerfelbrett mitte;

	// Konstruktor
    SpielTabelle() {
        addMouseListener( this );
    }

    // Methode paint() wird ueberlagert
    public void paint(Graphics tab) {
    	erstelleTabelle();
    }

	public void erstelleTabelle()	{

		Graphics tab = getGraphics();

		tab.drawRect( 100, 0, 100, 400);

		tab.setColor( Color.black );
		tab.drawLine( 20, 0, 200, 0); // Datenkopf
		tab.drawLine( 20, 15, 200, 15); // 1er Linie
		tab.drawString("1er", 20, 13); // 1er Text

		tab.drawLine( 20, 30, 200, 30); // 2er Linie
		tab.drawString("2er", 20, 28); // 2er Text

		tab.drawLine( 20, 45, 200, 45); // 3er Linie
		tab.drawString("3er", 20, 43); // 3er Text

		tab.drawLine( 20, 60, 200, 60); // 4er Linie
		tab.drawString("4er", 20, 58); // 4er Text

		tab.drawLine( 20, 75, 200, 75); // 5er Linie
		tab.drawString("5er", 20, 73); // 5er Text

		tab.drawLine( 20, 90, 200, 90); // 6er Linie
		tab.drawString("6er", 20, 88); // 6er Text

		tab.drawLine( 20, 92, 200, 92); // Trennlinie

		tab.drawLine( 20, 110, 200, 110); // Gesamt Linie
		tab.drawString("Gesamt", 20, 108); // 6er Text

		tab.drawLine( 20, 125, 200, 125); // plus 35 Punkte
		tab.drawString("+ 35", 20, 123); // plus 35 Punkte

		tab.drawLine( 100, 0, 100, 400); // senkrechte Spaltenlinie
	}

	public void setzePunkte( Graphics tab, int px, int py, int beahlten)	{
		int pu = 1;
		tab.drawString("" + pu, 110, 13); // Punkte 1er
	}
	
	public void mousePressed( MouseEvent me ) {
    } // mousePressed

    // Dummies
    public void mouseClicked( MouseEvent me ) {
    } // mouseClicked

    public void mouseReleased( MouseEvent me ) {
    } // mouseReleased

    public void mouseEntered( MouseEvent me ) {
    	int x = me.getX();
		int y = me.getY();
		Graphics tab = getGraphics();
		if((x>100) && (x<200) && (y>0) && (y<400))	{
	    	setzePunkte( tab, x, y, 0);
	    }
    } // mouseEntered

    public void mouseExited( MouseEvent me ) {
    } // mouseExited
}
```


und wie kann man auf Variablen in anderen Klassen in einer anderen Datei (Dateien gehören zu einem Projekt) zugreifen

bitte nur Antworten die wirklich helfen, beschäftige mich schon länger mit PHP und auf besserwisserei, soll heissen wenn einer meckern will was das fürn schlechter Code is, kann er das für sich behalten.

ich hoffe auf eure Hilfe

interprogy


----------



## Quaxli (23. Apr 2008)

Was für ein schlechter Code... 

Du hast für die Maus-Bewegung die falsche Methode verwendet. Wenn Du in der API nachliest steht da für mouseEntered(...):  Invoked when the mouse enters a component

Wenn Du also nicht zufällig Dein Panel verläßt, was vermutlich bei langsamer Bewegung der Fall ist, tut sich aus diesem Grund nix.
Ich verstehe zwar grundsätzlich nicht, warum Du das so realisieren willst, daß man erst mit der Maus drüber fahren muß, aber sei's drum. 
Schau' Dir mal den MouseMotionListener an, der ist eher das, was Du vermutlich brauchst. Du müßtest halt ein bißchen mehr Logik hinterlegen, ob ein Feld betrofffen ist.

Variabelen in anderen Klassen: Getter und Setter-Methoden in die Klasse einbauen.

Was Du mit Variablen in anderen Dateien meinst, verstehe ich nicht.


----------



## interprogy (23. Apr 2008)

ich will ja daß die Methode setzePunkte() ausgelöst wird wenn ich den Mauszeiger hinein bewege. wenn ich ihn wieder herausbewege soll die mit Methode setzePunkte() geschriebene Zahl wieder gelöscht werden indem ich einfach ein Rechteck darüber male. ist aber noch nicht implementiert und sollte auch kein Problem sein (es sei denn ich muss die Maus schnell aus dem Bereich bewegen) aber dann machts ja kein Spaß mehr.

Variablen in anderen Dateien deshalb weil jede Klasse in einer eigenen Datei is.

das Spiel an sich funzt, Compiler muckt auch nicht. weiss nicht wo der fehler is.

mein Problemis nur daß ich die Maus schnell hinein bewegen muss um den gewünschten Effekt zu erzielen.

hat noch jemand eine Idee?

PS: vielleicht sollte ich noch dazu schreiben, daß diese Datei (Klasse SpielTabelle) nicht die Hauptklasse is (sagt man das so?  ???:L  :?: )


                                   ----  Wuerfelbrett.java (Würfel mit den Punkten erstellen
Hauptdatei Kniffel.java
                                   ----  SpielTabelle.java (Tabelle mit den Punkten


die beiden Klassen Wuerfelbrett und SpielTabelle hab ich dann folgendermaßen eingebunden in die Kniffel.java

Datei Kniffel.java


```
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// ++ public class Kniffel extends Applet implements ActionListener ++
// +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
public class Kniffel extends Applet implements ActionListener	{

	Wuerfelbrett mitte;

	SpielTabelle tabelle;

    // ueberlagere die Methode init()
    public void init() {

        setBackground(Color.yellow);

        Button k1 = new Button("Würfeln");
		k1.setBackground( Color.lightGray );
		k1.addActionListener( this );
        setLayout( null );
        k1.setBounds(100, 100, 70, 30);
        add(k1);

        // Neue Instanz von Wuerfelbrett erzeugen
        // und dem BorderLayout hinzufuegen.
        mitte = new Wuerfelbrett();
        mitte.setBounds(0, 0, 340, 100);
        add(mitte);

        // Instanz von SpielTabelle erzeugen
        tabelle = new SpielTabelle();
        tabelle.setBounds(10, 150, 340, 600);
        add(tabelle);

    } // public void init()

    // implementiere die Methode fuer das Interface ActionListener
    public void actionPerformed(ActionEvent ae) {

        String cmd = ae.getActionCommand();
        if (cmd.equals("Würfeln")) {
	    	mitte.wuerfeln();
        }
    } // public void actionPerformed(ActionEvent ae)

} // Ende public class Kniffel extends Applet implements ActionListener
```


----------



## Quaxli (24. Apr 2008)

Die verwendete Mehtode ist trotzdem die Falsche. Die Mehtode schlägt halt zu, wenn Du die Maus in Dein Panel rein bewegst. Wenn dann der Zeiger noch nicht auf einem Kästchen steht, hast Du Pech, weil die Methode danach nicht mehr aufgerufen wirst. 

Prinzipiell sehe ich 2 Möglichkeiten zur Lösung:

1. Du änderst die GUI. Für jeden Tabelleneintrag erzeugst Du ein eigenes JPanel, JLabel, etc. welches nur den einen Wert anzeigst und hängst einen MouseListener dran, der auf MouseEntered reagiert.

2. Du nimmst, wie von mir vorgeschlagen, einen MouseMotionListener. Für die einzelnen Spalten definierst Du virtuelle Rechtecke in geeigneter Größe, die von Rectangle erben. Rectangle hat einen Methode contains(Point p), mit der Du ganz easy prüfen kannst, ob die Maus sich in einem der Rechtecke befindet.

Nur mit MouseEntered wirst Du nicht hinkommen, weil die Methode halt nur einmal zuschlägt, nämlich dann wenn Du die Komponente "betrittst".


----------

