mouseClicked und mouseMoved gleichzeitig verarbeiten

Status
Nicht offen für weitere Antworten.

Voyager

Mitglied
hi,
ich hab folgendes problem:
ich habe eine art moorhuhn-spiel nachgeproggt und wenn man dort schießen will während man die maus noch ein bisschen bewegt geht das nich, man muss die maus immer erst still halten..... das iss sehr unpraktisch weil man so nicht vernünftig zielen kann :? ich würde also ganz gerne wissen ob man diese ereignisse nich irgendwie parallel abfangen/abarbeiten kann (vieleicht mit threads)? ich hab schonmal versucht den "addMouseListener" befehl in die run()-methode eines threads zu packen, aber hat leider nich gefunzt.....

Mfg
Voyager
 
M

macfreakz

Gast
@CelikBlek: doch! Wenn der Computer Dual Prozessor hat ... ;-)

@Voyagar: alles wird sequentiell abgefangen. Poste am besten dein Code hier!
 

dotlens

Top Contributor
hmmm, du köntest die mausPosition in einem Thread abfragen, was dann aber auch immer abgefragt wird, wenn du die Maus nicht bewegst. und nur das schissen mit dem listener lösen(listeners kann man nicht als thread machen)
 

CelikBlek

Bekanntes Mitglied
@ macfreakz: :D ich meine natürlich in einem "normalen" verbraucherrödelkisten...
@ dotlens : interessante Frage wäre: Warum kann man Listener nicht in einem Thread laufen lassen? weisst du den grund auch?
@ voyager: genau code her :)
 

dotlens

Top Contributor
ich weiss es nicht, kann mir aber vorstellen, dass das damit zu tun hat, dass swing nicht thread sicher ist und die ActionListener auf Swingelemnte reagieren. ausserdem müssen sie im gleichen "thread" wie das GUI sein, sonst könnten Sie ja nicht reagieren...
das ganze sind aber nur meine gedanken und bin mir deshalb auch nicht sicher

@voyager: code her!! ;)

EDIT: das hilft dir vieleicht weiter: http://www.java-forum.org/de/viewtopic.php?t=9728
 

Voyager

Mitglied
hi,
hier iss der code (iss nich das spiel selbst, sondern ein "testprogramm" das das selbe Problem aufweist):
Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class Mouse extends Applet implements Runnable
{
	private MouseEventHandler mhandler;
	private Thread thread;

	public void init()
	{
	    resize(640, 480);
	    mhandler = new MouseEventHandler();
	    addMouseListener(mhandler);
	    addMouseMotionListener(mhandler);
	}
	
	public void start()
	{
	    if(thread == null)
	    {
	        thread = new Thread(this);
	        thread.start();
	    }
	}
	
	public void stop()
	{
	    if(thread != null)
	    {
	        thread.stop();
	        thread = null;
	    }
	}

	public void paint(Graphics g)
	{
	    g.drawString(mhandler.p.toString(), 10, 35);
	    g.drawString("Left Mouse Clicks: " + mhandler.left_mouse_clicks, 10, 55);
	    g.drawString("Right Mouse Clicks: " + mhandler.right_mouse_clicks, 10, 75);
	}
	
	public void run()
	{
	    while(true)
	    {
	        repaint();
	        
	        try
	        {
	            thread.sleep(20);
	        }
	        catch(InterruptedException e)
	        {
	        }
	    }
	}
}

class MouseEventHandler implements MouseListener, MouseMotionListener
{
    public int left_mouse_clicks  = 0;
    public int right_mouse_clicks = 0;
    public Point p;
    
    public MouseEventHandler()
    {
        p = new Point(-1, -1);
    }
    
    public void mouseExited(MouseEvent evt)
    {
    }
    
    public void mouseEntered(MouseEvent evt)
    {
    }
    
    public void mouseClicked(MouseEvent evt)
    {
        if(evt.getButton() == 1)
        {
            left_mouse_clicks++;
        }
        else if(evt.getButton() == 3)
        {
            right_mouse_clicks++;
        }
    }
    
    public void mouseReleased(MouseEvent evt)
    {
    }
    
    public void mousePressed(MouseEvent evt)
    {
    }

    public void mouseMoved(MouseEvent evt)
    {
        p.x = evt.getX();
        p.y = evt.getY();
    }
    
    public void mouseDragged(MouseEvent evt)
    {
    }
}
Wie bereits gesagt, iss das Problem folgendes:
Ich bewege die Maus und während ich dies tue drücke ich z.B. die Rechte Maustaste aber nichts passiert. Damit etwas passiert muss ich erst die Maus stillhalten.

Mfg
Voyager
 

dotlens

Top Contributor
die actionEvents blokieren sich gegenseitig, und da swing und awt nicht threadsicher sind weiss ich auch nicht wie das problem zu lösen ist.
würde dein applet nicht durch einen Thread aktualisieren sonden nach jedem event... sparst du ressis wenn de anwender nichts macht ;)
 

0xdeadbeef

Top Contributor
Schieb doch den mouseClicked-Code einfach nach mousePressed, dann klappt's auch mit dem Nachbarn ;)

Code:
public void mouseClicked(MouseEvent evt)
    {
    }

...

public void mousePressed(MouseEvent evt)
    {
        if(evt.getButton() == 1)
        {
            left_mouse_clicks++;
        }
        else if(evt.getButton() == 3)
        {
            right_mouse_clicks++;
        }
    }

...
 

Voyager

Mitglied
vielen dank 0xdeadbeef, ich weiß zwar nich wirklich warum aber dein Vorschlag scheint Wirkung zu zeigen :D iss zwar nich ganz das was ich erwartet hab aber wenns funktioniert solls mir vollkommen recht sein :wink:

Mfg
Voyager
 

0xdeadbeef

Top Contributor
Ich gehe davon aus, daß MouseClicked intern MousePressed und MouseReleased benutzt und dabei berücksichtigt, daß die Position sich nicht verändern hat: genau das will man schließlich, wenn man einen Button drückt. Man will ja nicht irgendwo drücken, die Maus auf den Button bewegen und wieder loslassen, sondern Drücken und Loslassen sollen an einer Position erfolgen (evtl. mit etwas Kulanz für Zittrige;) ).

Hier geht es ja aber nicht darum, solche GUI-Klicks mitzubekommen, sondern man möchte bloß wissen, ob ein Mausohr gedrückt wurde.

Außerdem hab ich's probiert :)
 
S

Sir MacKerberus

Gast
Könnte man nicht einfach zwei verschiedene MouseListener adden die dann quasi parallel arbeiten?
 

0xdeadbeef

Top Contributor
Ich bringe das Thema nochmal nach oben, weil ich jetzt selber nochmal darüber gestolpert bin.

Damit die Mauskoordinaten auch bei gedrückter Taste geändert werden, muß man zusätzlich noch die Methode mouseDragged im Listener implementieren. Ansonsten bleibt die Position unverändert, während eine Taste gedrückt ist, obwohl die Maus bewegt wird.
Solange eine Maustaste gedrückt bleibt, werden nämlich keine mouseMoved-Ereignisse ausgelöst, sondern mouseDragged-Ereignisse. Eigentlich auch klar, denn genau das macht man ja: Dragging = Ziehen der Maus mit gedrückter Taste.
Im Normalefall sollte man also auch mouseDragged implementieren.
Im hier genannten Beispiel also:
Code:
    public void mouseDragged(MouseEvent evt)
    {
        p.x = evt.getX();
        p.y = evt.getY();
    }
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
LexeB4F mouseClicked streickt bei Mausbewegung Allgemeine Java-Themen 5
Z MouseClicked -> Rechtsklick Allgemeine Java-Themen 15
P mouseClicked(MouseEvent me) Allgemeine Java-Themen 6
L MouseClicked / MouseReleased Allgemeine Java-Themen 5
1 Draggen resultiert in mouseClicked() Allgemeine Java-Themen 6
R Programm führt Methoden gleichzeitig aus Allgemeine Java-Themen 2
kodela Zwei gleichzeitig gedrückte Steuertasten Allgemeine Java-Themen 10
J Verschiedene Runtime Versionen gleichzeitig? Allgemeine Java-Themen 12
S Bibliothek gleichzeitig fuers JDK und Android entwickeln Allgemeine Java-Themen 8
D BlueJ, Variablen die mehrfach vorkommen gleichzeitig umbenennen Allgemeine Java-Themen 3
J Zwei Wavdateien gleichzeitig mit SourceDataLine abspielen Allgemeine Java-Themen 0
I Anwendung auf Netzlaufwerk von mehreren Usern gleichzeitig nutzbar. Allgemeine Java-Themen 3
K Mehrere Programmiersprachen gleichzeitig lernen Allgemeine Java-Themen 3
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
P JDK und JVM: 64bit Version UND 32bit Version gleichzeitig? Allgemeine Java-Themen 5
M Gleichzeitig lesen und schreiben Allgemeine Java-Themen 6
J Mehrere CPUs gleichzeitig ansprechen Allgemeine Java-Themen 4
A in mehrere Outputstreams gleichzeitig schreiben Allgemeine Java-Themen 4
N Mehrere Audioclips gleichzeitig wiedergeben Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben