Timer und GIF Animationen pausieren während Maus sich bewegt

Tazmo

Mitglied
Solange ich meine Maus in einem JFrame bewege, hören meine Timer (egal ob Swing Timer oder TimerTask) auf ihre Methoden aufzurufen, selbst animierte GIFs (ImageIcon in einem JLabel) hören auf zu animieren. Dies tritt nur auf unter macOS und bei Benutzung einer Gaming Maus (getestet mit der Rockat Kone XTD und einer Rauer Gaming Maus). Wenn ich z.B. mein Trackpad benutze funktioniert alles wunderbar.

Hier ein Beispielprogramm bei dem bei mir dieser Fehler auftritt:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.Timer;

public class Mouse{
    public static void main(String[] args){
        JFrame frame = newJFrame();

        frame.setSize(500, 500);
        frame.setVisible(true);

        Timer timer =newTimer(10, newActionListener(){

            @Override
            public void actionPerformed(ActionEvent e){
                System.out.println("foo");
            }
        });

        timer.start();
    }
}
So schaut das ganze bei mir dann aus:

source.gif


Während ich meine Maus in dem JFrame bewege wird die actionPerformed() Methode nichtmehr aufgerufen und somit auch kein "foo" in der Konsole mehr ausgegeben.

Woran könnte das liegen?
 

AndyJ

Bekanntes Mitglied
Seltsames Problem, woran das liegt weiss ich auch nicht. Ich koennte mir aber vorstellen, dass die Mausevents so haeufig sind, dass die Timer-events hinten angehaengt werden. Der javax.swing.Timer scheduled die Events auf dem EDT. Ein System.out muss aber nicht auf dem EDT ausgefuehrt werden. Probier mal diese Variante aus:

Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.*;
import javax.swing.JFrame;
import javax.swing.Timer;

public class Mouse{
  public static void main(String[] args){
  JFrame frame = new JFrame();

  frame.setSize(500, 500);
  frame.setVisible(true);

  ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(1);   
  scheduledExecutorService.scheduleAtFixedRate(() -> System.out.println("foo"), 50, 10, TimeUnit.MILLISECONDS);
   
//  Timer timer =new Timer(10, new ActionListener(){
//
//  @Override
//  public void actionPerformed(ActionEvent e){
//  System.out.println("foo");
//  }
//  });

//  timer.start();
  }
}

Wenn du was machst, dessen Ergebnis die UI updated, dann musst du das halt selber an den EDT anhaengen.

Cheers,
Andy
 

dzim

Top Contributor
Ah. Auch wenn ich mich zwar nicht gross mit AWT/Swing mehr beschäftige, aber die Erklärung klingt absolut einleuchtend: Während vom UI-Thread die Mouse-Events verarbeitet werden, ist keine Resource mehr für den Timer frei! Ich denke, das werde ich mir auch mal für JavaFX lieber merken!
 

Tazmo

Mitglied
Vielen Dank AndyJ!

Dein Post hat mich auf die Idee gebracht die Polling-Rate meiner Gaming Maus von 1000Hz auf 500Hz zu reduzieren und das hat tatsächlich geholfen, nun funktionieren alle Timer und animiere GIFs wieder wunderbar. Anscheinend waren 1000Hz Abfragerate einfach zu viel für Java.

Deine Lösung habe ich auch ausprobiert und es hat auch geklappt. Allerdings ist mir noch nicht ganz klar was du gemacht hast. Vielleicht könntest du erklären was es mit dem ScheduledExecutorService auf sich hat?

Grüße,
Tazmo
 

dzim

Top Contributor
Der Punkt ist einfach, dass du mit Maus-Bewegungen Events auf dem UI-Thread auslöst - in deinem Fall eben bis zu 1000/s. Dein Timer läuft (oder lief) auf dem selben Thread und vermutlich wurde dieser Timer "schlafen" gelegt, um die Eingabe-Events (Maus) mit höherer Priorität zu bearbeiten.
@AndyJ hat nun mit seiner Lösung den "Timer" auf einen anderen Thread verlagert. Konkret wird der ScheduledExecutorService verwendet. Das ist vielleicht nicht ganz das selbe (kenne die Timer-API jetzt nicht so genau), sollte aber am Ende das selbe Ergebnis liefern. Wichtig ist nur, dass wenn du von dort die UI updaten möchtest, dass du dies über die Methode SwingUtilites#invokeLater tust.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
E JDialog mit count down timer AWT, Swing, JavaFX & SWT 1
M 2D-Grafik timer bei Analoguhr AWT, Swing, JavaFX & SWT 2
A Timer AWT, Swing, JavaFX & SWT 1
H Timer ohne alles lahmzulegen? AWT, Swing, JavaFX & SWT 2
O Timer in JOptionPane anzeigen AWT, Swing, JavaFX & SWT 2
ralfb1105 Swing Timer in SwingWorker stoppen AWT, Swing, JavaFX & SWT 4
W Swing JLabel jede Sekunde aktualisieren, ohne Timer zu benutzen AWT, Swing, JavaFX & SWT 4
D Timer für Bildfolge in einem jLabel AWT, Swing, JavaFX & SWT 5
M Event Handling MousePressed vs. Timer! AWT, Swing, JavaFX & SWT 5
F Java Timer Bug? AWT, Swing, JavaFX & SWT 6
B Timer, TimerTask und Warten AWT, Swing, JavaFX & SWT 4
R Performance Drag and Drop & Timer AWT, Swing, JavaFX & SWT 3
E Problem mit Timer und Swing AWT, Swing, JavaFX & SWT 8
N AWT Timer überschreiben? AWT, Swing, JavaFX & SWT 8
P Label rotieren mit Timer AWT, Swing, JavaFX & SWT 5
F Swing GUI und Model mit Timer AWT, Swing, JavaFX & SWT 13
K Threads - Timer - run() mehrfach parallel? AWT, Swing, JavaFX & SWT 2
J Nach Timer ausführen AWT, Swing, JavaFX & SWT 6
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
D Timer JFrame AWT, Swing, JavaFX & SWT 7
F Swing timer nimmt delay nicht an AWT, Swing, JavaFX & SWT 2
S Swing Timer, Countdown AWT, Swing, JavaFX & SWT 2
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
H Timer/Stoppuhr in MenuBar anzeigen AWT, Swing, JavaFX & SWT 4
D Applet Methode in Timer einbinden AWT, Swing, JavaFX & SWT 6
F Applet Applet starten...(+Timer?) AWT, Swing, JavaFX & SWT 12
R Probleme mit Swing Timer AWT, Swing, JavaFX & SWT 6
C Timer Problem AWT, Swing, JavaFX & SWT 5
VfL_Freak Swing kann ich einen laufenden Timer mitten in der Ausführung abbrechen? AWT, Swing, JavaFX & SWT 6
H Swing Timer Probleme AWT, Swing, JavaFX & SWT 5
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
P Game of Life - PaintComponent-Problem / Timer? AWT, Swing, JavaFX & SWT 8
B JLabel mittels Timer und setLocation verschieben AWT, Swing, JavaFX & SWT 3
O Swing es können keine neuen Labels hinzufügt werden während der Timer läuft AWT, Swing, JavaFX & SWT 14
C Timer erstellen? AWT, Swing, JavaFX & SWT 2
E AWT Problem mit Repaint (in Loop oder Timer) AWT, Swing, JavaFX & SWT 3
K Timer und Threads ruckeln für Fotoschwenk AWT, Swing, JavaFX & SWT 3
L Timer Swing GUI AWT, Swing, JavaFX & SWT 2
G Swing Timer stoppen AWT, Swing, JavaFX & SWT 4
B Swing-Timer AWT, Swing, JavaFX & SWT 4
D javax.swing.Timer bringt NullPointerException AWT, Swing, JavaFX & SWT 4
J Swing timer? AWT, Swing, JavaFX & SWT 2
C Timer, Darstellung einer Uhr AWT, Swing, JavaFX & SWT 4
Z javax.swing.Timer: wie stoppen??? AWT, Swing, JavaFX & SWT 9
W Können Animationen in JavaFX "verschluckt" werden? AWT, Swing, JavaFX & SWT 8
A JavaFX Zeitversetzte Animationen AWT, Swing, JavaFX & SWT 3
H Gif Animationen zentrieren AWT, Swing, JavaFX & SWT 9
R Berechnung von Animationen AWT, Swing, JavaFX & SWT 7
Maxim6394 Java 3d - Animationen importen AWT, Swing, JavaFX & SWT 6
Weiti Swing Animationen - Drehung aller Komponenten auf Knopfdruck AWT, Swing, JavaFX & SWT 12
J Balkendiagramm und Gif animationen AWT, Swing, JavaFX & SWT 4
J 3D-Animationen in Swing-Fenster AWT, Swing, JavaFX & SWT 2
I JavaFX Programmcode pausieren gestaltet sich als schwierig AWT, Swing, JavaFX & SWT 7
H JavaFX Prozess bei dem Start pausieren AWT, Swing, JavaFX & SWT 5
A Methode pausieren bis anderes Ereignis ausgeführt AWT, Swing, JavaFX & SWT 2
I JavaFX-Scene-Überlagerung/Wechsel mit pausieren der anderen Scene AWT, Swing, JavaFX & SWT 0
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
M Hauptprogramm pausieren und auf Ergebnis eines JDialogs warten AWT, Swing, JavaFX & SWT 7
L SwingWorker Thread pausieren AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben