Mausposition auf dem Bildschirm

Status
Nicht offen für weitere Antworten.
S

Steven

Gast
Hallo,

ich möchte die Mausposition auf dem Bildschirm erfahren. In einem Fenster weis ich wie das geht aber wenn man ausserhalb des Fenster ist funktioniert das nicht mehr. In meinem Fenster ging das mit addMouseMotionListener.

Danach möchte ich in gewissen Zeitabständen (vielleicht ne halbe Sekunde) die Position auf dem Bildschirm abfangen und speichern. Ich brauche diese Daten für ein Beispiel wie man Zufallszahlen erzeugen kann.

Jemand eine Idee?

MFG
 
S

Steven

Gast
Wie kann man denn alle x Millisekunden irgendein Ereignis auslösen? Wenn ich es so mache aktualisiert er während der Schleife nichts. Somit auch nicht die Mausposition

Code:
long start = System.currentTimeMillis();
		
		while (i < 10)
		{
			if (start+900 < System.currentTimeMillis())
			{
				i++;
				start += 900;
				
				//hier nun x und y position der Maus abfragen
			}
		}
 

K-Man

Bekanntes Mitglied
Verwende dazu einen Thread der parallel zu deinem Hauptthread läuft. Dieser neue Thread kann alle 50ms ein Ereignis auslösen, ohne dass das Programm darunter leidet.
Code:
class EreignisAusloeser extends Thread
{
   public void run()
   {
   	while(isInterrupted() == false)
   	{
   	    doSomthing();
	   			
   		try
		{
			Thread.sleep(50);
		}
		catch(InterruptedException e)
		{
			e.printStackTrace();
		}	   			
   	}
   }
}

Diesen Thread startest du mit EreignisAusloeser.start() und beendest ihn mit EreignisAusloeser.interrupt().
Solange der Thread läuft, wird alle 50ms die Methode doSomething() aufgerufen.[/code]
 
S

Steven

Gast
Danke :D

Ich habe aber noch eine Frage:

Ähm, wenn ich in der doSomething Methode den Tread stoppen will....was mache ich dann? stop()? interrupt()?
 

K-Man

Bekanntes Mitglied
Steven hat gesagt.:
Danke :D

Ich habe aber noch eine Frage:

Ähm, wenn ich in der doSomething Methode den Tread stoppen will....was mache ich dann? stop()? interrupt()?
interrupt(), da stop unsicher ist...hab ich auch erst an diesem Wochenende erfahren ;)
 

Illuvatar

Top Contributor
K-Man hat gesagt.:
Steven hat gesagt.:
Danke :D

Ich habe aber noch eine Frage:

Ähm, wenn ich in der doSomething Methode den Tread stoppen will....was mache ich dann? stop()? interrupt()?
interrupt(), da stop unsicher ist...hab ich auch erst an diesem Wochenende erfahren ;)

Deshalb die Abfrage mit isInterrupted().

Hast du jetzt eine Möglichkeit gefunden, die Mausposition abzufragen? Wenn ja, würde sie mich auch interessieren.
 

K-Man

Bekanntes Mitglied
Warum willst du die MousePosition haben, wenn der Cursor nicht mal in deiner Anwendung ist? Das geht wohl nicht so einfach, wenn überhaupt. Vielleicht kannst du die GlassPane auf den ganzen Schirm verteilen und die Mouseposition auf der Glasspane ausgeben?
 
S

Steven

Gast
Die Mausposition auf dem ganzen Bildschrim habe ich nicht abfangen können. Deshalb werden jetzt einfach alle Komponenten unsichtbar gemacht und das Fenster wird auf Bildschirmgröße gesetzt. Nun kann er User die Maus wild auf dem Fensterbewegen und nach gewissen zeitlichen Abständen werden die X und Y Koordinaten genommen um eine Zufallszahl zu erzeugen.
 
S

Steven

Gast
Leider muss ich das Dingen bald fertig haben. Deswegen kann ich nicht warten.

Anscheinend habe ich mich aber zu früh gefreut. Ich kann machen was ich will, der Thread lässt sich nicht beenden. Es gibt immer Exceptions (InterruptedException). Es kann doch nicht so schwer sein???? Was mache ich denn falsch.

So soll es ungefähr werden:


Code:
class Test extends Dialog implements ActionListener
{
                    //Komponenten und Attribute...	
	static JButton startButton = new JButton("Start");
	
	private static int x;
	private static int y;
	private static String MouseSeed;
	
	//Methoden und Konstruktor
	//-----------------------------------------------------------------------		
	public Test(JFrame parent) 
	{
		super(parent, "Test", true); 

		setSize(350, 350);
		
		add(button, BorderLayout.SOUTH);
		
		//Mausbewegung
		addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
			  public void mouseMoved(java.awt.event.MouseEvent evt) {
				  myMouseMoved(evt);}});			

		setVisible(true); 
	} 
	//-----------------------------------------------------------------------
	public static void setMouseSeed(String s)
	{
		MouseSeed = s;
	}
	//-----------------------------------------------------------------------	
	public static int getx()
	{
		return x;
	}
	//-----------------------------------------------------------------------	
	public static int gety()
	{
		return y;
	}

	private void startButtonActionPerformed(ActionEvent evt)
	{
		if (OpenFile)
		{
			JOptionPane.showMessageDialog(null, "Bewegen sie die Maus nun ca 20 Sekunden zufällig hin und her...");
		
			EreignisAusloeser test = new EreignisAusloeser(); 
//die Komponenten unsichtbar gemacht werden		
//Fenster maximieren			
setLocation(0, 0);
			setSize((int)getToolkit().getScreenSize().getWidth(), (int)getToolkit().getScreenSize().getHeight());		
			
			test.start();
		}

	}
	//-----------------------------------------------------------------------
	private void myMouseMoved(java.awt.event.MouseEvent evt)
	{
	x = evt.getX();
	y = evt.getY();
	}
	//-----------------------------------------------------------------------		
	//-----------------------------------------------------------------------
	public void setGroesse(int a, int b) 
	{ 
		setSize(a, b);
	}
	//-----------------------------------------------------------------------	  
}


//Tread für die Maus aufzeichnung

class EreignisAusloeser extends Thread 
{ 
   String seed = "";

   public void run()
    
   { 
	  while(isInterrupted() == false) 
	  { 
		  getXY(); 
                
	  try 
	  { 
		 Thread.sleep(500); 
	  } 
	  catch(InterruptedException e) 
	  { 
		 e.printStackTrace(); 
	  }                
	  } 
   } 
   public void getXY()
   {
   	   	
   	seed += Integer.toString((BasicKey.getx()+BasicKey.gety())%10);
   	
   	if (seed.length() > 18)
   	{
   		BasicKey.setMouseSeed(seed);
   		
   		BasicKey.setAktiv(true); //Methode um die Komponenten der Klasse wieder zu aktivieren

   		interrupt();
   		
   	} 
   }
}
 
B

Beni

Gast
Naja, du rufst ja auch "interrupt()" auf...
Also lösch einfach das "printStachTrace" :wink:

Was ich aber nicht weiss, ist ob "isInterrupted" wirkich auf true geht, wenn der Thread am schlafen ist. Musst du ausprobieren.
 
S

Steven

Gast
Oh ja, das habe ich nicht gesehen.

Aber es geht trotzdem nicht. Bis zum Aufruf von interrupt() werden alle 500 Millis wunderbar die Mauspositionen "verarbeitet". Sobald interrupt() aufgerufen wird, wird die Konsole Endlos vollgeschrieben. Anwendung beenden hilft ja nicht. Irgendwie scheint der Thread trotzdem fröhlich weiter zu machen :cry:

Ich habe um zu testen ob der Thread auch wirklich nicht mehr arbeitet System.out.println() vor interrupt() eingefügt.
 
B

Beni

Gast
Ich bin ein bisschen ratlos... zumal ich dein Bsp schlecht kompilieren kann.
Aber versuch mal das hier:

Code:
   public void run()
   {
     boolean stop = false;
     while(isInterrupted() == false && stop == false)
     {
        getXY();
               
     try
     {
       Thread.sleep(500);
     }
     catch(InterruptedException e)
     {
        stop = true;
     }               
     }
   }
 
S

Steven

Gast
Hey,

erstmal vielen dank für eure Hilfe und Gedult!!!!

Also hier ist mein letzter Versuch der auch Lauffähig ist! Leider bekomme ich es aber nicht hin aus dieser Klasse ein Objekt zu machen welches ich aus einer anderen Klasse aufrufen kann :bahnhof: Wenn das jetzt noch klappen würde wäre es super! Sobald ich die Main-Methode raus nehme und in einer anderen Klasse das Objekt erzeuge wird die Mausposition nicht mehr aktualisiert. Hab mal was von synchronize gehört. Kann es das sein?

Code:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ThreadusInterruptus extends JFrame implements Runnable{

  int x=0;
  int y=0;
  String seed = "";
  boolean go = true;
  double time = 0;

  public ThreadusInterruptus (String Title) 
  {
  	super (Title);
	
	addWindowListener(new WindowAdapter() {
		public void windowClosing (WindowEvent evt) {System.exit(0);}});

	setSize(800, 600);
	setLocation(0, 0);

	Thread thread1 = new Thread(this, "Testing");

	thread1.start();

	addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { 
  		public void mouseMoved(java.awt.event.MouseEvent evt) { 
  			myMouseMoved(evt);}}); 
	
	setVisible(true);
  }
  
  public void run()
  {
  	while (go) 
	{
		try 
		{ 

			if (seed.length() < 20)
			{
				seed += (x + y) % 10;
				time += 0.5;
				setTitle("X:" + x + " Y:" + y + " Zeit: "+time);
			}
			else 
			{
				go = false;
				JOptionPane.showMessageDialog(null, seed);
				System.exit(0);
			} 

		Thread.sleep(500); 
		} 
		catch (Exception e) { }    
	}

  }
  
  private void myMouseMoved (java.awt.event.MouseEvent evt)
  {
		x = evt.getX();
		y = evt.getX();
  }
  
  public static void main (String args[]) 
  {
  	ThreadusInterruptus f = new ThreadusInterruptus("Hallo");
  }
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Wieso wird immer die falsche Mausposition angegeben? Java Basics - Anfänger-Themen 1
F Mausposition im Spielfeld auslesen Java Basics - Anfänger-Themen 26
hdi Mausposition auf Desktop ermitteln Java Basics - Anfänger-Themen 2
R Mausposition außerhalb des SWING Fensters Java Basics - Anfänger-Themen 2
Lazybone Mausposition fesstellen Java Basics - Anfänger-Themen 4
B großzügiges Pixelraster über Bildschirm legen Java Basics - Anfänger-Themen 7
M Abfrage j/n und Bildschirm löschen Java Basics - Anfänger-Themen 3
C 1x1 Ausgabe auf dem Bildschirm Java Basics - Anfänger-Themen 3
CptK Interface Bilder über Bildschirm bewegen, bis der Abstand zum vorherigen zu groß wird Java Basics - Anfänger-Themen 13
V Attribut aus aus jedem ArrayListen index auf Bildschirm ausgeben Java Basics - Anfänger-Themen 9
JAVAnnik Klick auf Bildschirm Java Basics - Anfänger-Themen 11
F Bildschirm-Programm Java Basics - Anfänger-Themen 21
S Bildschirm für alle Klassen erstellen Java Basics - Anfänger-Themen 8
P Ausgabe auf dem Bildschirm Java Basics - Anfänger-Themen 9
U PNG-Datei einlesen und anschließend auf dem Bildschirm ausgeben Java Basics - Anfänger-Themen 7
Z Alle 15 sek eine Zufallszahl auf Bildschirm Java Basics - Anfänger-Themen 10
G Text am Bildschirm ausgeben Java Basics - Anfänger-Themen 7
G Auf Bildschirm (kein Fenster) schreiben Java Basics - Anfänger-Themen 2
G Punkt auf Bildschirm erstellen? Java Basics - Anfänger-Themen 14
G button nimmt ganzen bildschirm ein! Java Basics - Anfänger-Themen 18
T Seitenumbruch? Konsole/Bildschirm löschen? Java Basics - Anfänger-Themen 7
G Befehl für die Ausgabe auf dem Bildschirm in Großbuchstaben Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben