mouseWheelMoved => erst reagieren, wenn für 1s das Mausrad nicht mehr benutzt wurde

Dumdidum

Mitglied
Hallo liebe Java-Forum Gemeinde,

ich "spiele" gerade schon seit mehrere Stunden an einem Problem herum und hab es bisher nicht geschafft es zu lösen.

MEIN ZIEL:
Ich befinde mich mit der Maus in einem Panel und benutze dort das Mausrad. Dabei verändert sich ein Wert nach oben oder unten. Sobald nun ca für 1s das Mausrad nicht mehr bewegt wird (seit vllt ca 1s) soll mit dem von dem Mausrad gewähltem Wert eine Berechnung ausgeführt werden.

Probiert habe ich es so:
- eine Membervariable die den aktuellen Wert beinhaltet
- bei jedem "mouseWheelMoved-Event" wird ein Thread gestartet der 1s schläft und dann am Ende schaut ob der Wert zu dem Zeitpunkt wo der Thread gestartet wurde dem letzten entspricht
ABER: Zum einen ist das sicher nicht der IDEALE Weg und zu anderen kanne es dazu kommen, dass man eigentlich noch am scrollen ist und nur zufällig wieder an dem "Wert" vorbei kam.


Hätte vllt jemand einen Tipp für mich, wie man sowas sauber löst!?
 

Ruzmanz

Top Contributor
Wie man das sauber löst, weis ich nicht. Die Events speichern die Zeit des Aufrufs. Wenn ich das in der API richtig sehe, müsste es ein "getWhen()" geben.

if(new Time().getTime() - event.getWhen() > 1000) {
... eine Sekunde seit dem letzten Event ...
}

Den Zeitpunkt des letzten Events kannst du irgendwo zwischenspeichern und wenn der Thread an when+1000 angekommen ist, dann ist eine Sekunde vergangen.
 

X5-599

Top Contributor
Ok ich hatte etwas Zeit also hab ich mal ein Beispiel gemacht. Ich verstehe nur nicht ganz was mit "für 1s nicht mehr bewegt wird/seit ca 1s" gemeint ist.
Hier verhält es sich so: Sobald gescrollt wird, läuft der Timer los. Bei jedem neuen Scoll Event wird er zurückgesetzt. Sollte nach einem Scroll Event 1s vergangen sein, führt der Timer seine actionPerformed() einmalig aus. Also die Berechnung wird mit dem aktuellen value durchgeführt und danach wird wieder der Ausgangs value gesetzt.

Java:
public static void main(String[] args)
{
	SwingUtilities.invokeLater(new Runnable() {
		
		@Override
		public void run()
		{
			JFrame frame = new JFrame("Test Frame");
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setSize(800, 600);
			frame.setLocationRelativeTo(null);
			
			
			final AtomicInteger ai = new AtomicInteger(0);
			final Timer t = new Timer(1000, new ActionListener(){

				@Override
				public void actionPerformed(ActionEvent e)
				{
					System.out.println("calculate with value=" + ai.get());
					
					
					//reset value
					ai.set(0);
				}
				
			});
			t.setRepeats(false);
			
			JPanel panel = new JPanel();
			panel.addMouseWheelListener(new MouseWheelListener() {
				@Override
				public void mouseWheelMoved(MouseWheelEvent e)
				{
					t.restart();
					
					int value;
					if(e.getPreciseWheelRotation() < 0)
						value = ai.incrementAndGet();
					else
						value = ai.decrementAndGet();
					
					
					System.out.println(value);
				}
			});
			
			frame.add(panel, BorderLayout.CENTER);
			frame.setVisible(true);
		}
		
	});
	
}
 

arilou

Bekanntes Mitglied
X5-599's Lösung scheint mit recht elegant; ich persönlich hätte mir den Zeitstempel des letzten Events irgendwo abgespeichert sowie ob ich schon gerechnet habe; dann kann ein Thread ab und zu (20* pro Sekunde) nachsehen, ob
  • seither >1 s vergangen ist UND
  • noch nicht berechnet wurde.
Und dann eben rechnen oder auch nicht.
Der MouseWheel-Listener muss dann zuerst den Zeitstempel neu setzen, und dann "noch nicht gerechnet" vermerken.
 

Dumdidum

Mitglied
Erstmal sorry dafür, dass ich keine Rückmeldung gegeben habe.. kam leider erst jetzt wieder dazu.

Ich denke alle 3 Varianten könnten besser als meine funktionieren aber ich hatte dann mal X5-599's Variante ausprobiert und es klappt wirklich super =)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Input/Output FileChannel writes / werden diese gecached vom OS und dann erst geschrieben? Allgemeine Java-Themen 6
S Fehlermeldungen erscheinen erst in der Ausführung des Programms Allgemeine Java-Themen 11
H Runtime reagiert erst wenn Programm abbricht Allgemeine Java-Themen 1
S Start des zweiten Threads erst nach Beenden des ersten Threads Allgemeine Java-Themen 13
T MEthodenauruf testen, wenn instanz erst erzeugt wird Allgemeine Java-Themen 0
D Nutzen, erst deklarieren, oder neu erstellen? Allgemeine Java-Themen 11
G Button-Registrierung beim ActionListener erst NACH Tastendruck Allgemeine Java-Themen 2
H Scanner: Ausgabe erst nach Abbruch Allgemeine Java-Themen 8
H StackOverflowError erst ab 87 Array Elementen Allgemeine Java-Themen 4
F externes Programm beginnt erst nach dem ende des mainprogrammes Allgemeine Java-Themen 3
-MacNuke- Calendar erst nach getTime() gesetzt? Allgemeine Java-Themen 4
T Threadsicheres wait() [lock erst mit wait() abgeben] Allgemeine Java-Themen 31
S Zweiten Thread erst starten wenn erster Thread beendet ist ? Allgemeine Java-Themen 6
B Datei erst öffnen, wenn EOF gesetzt ? Allgemeine Java-Themen 4
M Programmablauf nach letzter eingabe erst fortsetzten Allgemeine Java-Themen 2
G Aktualisierung erst nach minimiertem Browser Allgemeine Java-Themen 6
F Werte von Member-Variablen erst im Konstruktor setzen? Allgemeine Java-Themen 7
C externes Programm läuft erst nach schließen des mainprogramm Allgemeine Java-Themen 7
S [1/2done] Woher bekommt man libarys die es erst ab 1.6 gibt. Allgemeine Java-Themen 10
J Bibliotheken erst zur Laufzeit laden Allgemeine Java-Themen 5
N InputStream erst ab gegebener Position Allgemeine Java-Themen 4
S erst containsKey oder gleich get Allgemeine Java-Themen 9
bernd java.util.Scanner erst ab Java 1.5? Allgemeine Java-Themen 4
S Handschrift einlesen & darauf reagieren OCR Allgemeine Java-Themen 2
B OOP Auf Zustandsänderungen von Objekten reagieren Allgemeine Java-Themen 2
D auf STRG reagieren befor Grafikkomponente Allgemeine Java-Themen 4
Z Wie auf Fehler reagieren Allgemeine Java-Themen 2
O Auf alle Events reagieren Allgemeine Java-Themen 3
A Auf Zeitpunkt reagieren Allgemeine Java-Themen 6
S JTree selektion erkennen und drauf reagieren Allgemeine Java-Themen 2
B Observer reagieren beim 2ten mal nicht Allgemeine Java-Themen 23
M JFileChooser wird rechts oben mit x beendet - wie reagieren? Allgemeine Java-Themen 2
T Java-Applet auf Doppelklick reagieren lassen Allgemeine Java-Themen 2
M Thread überwachen / auf Thread-Tod reagieren Allgemeine Java-Themen 7
G Auf KeyEvent reagieren, wenn das Fenster nicht aktiv ist Allgemeine Java-Themen 8

Ähnliche Java Themen

Neue Themen


Oben