2016-11-22 104 views
7

Gdy przenosimy mysz do gier wewnątrz javax.swing.JFrame, wszystkie animowane GIF (javax.swing.ImageIcon w środku javax.swing.JLabel) przestają się animować, dopóki mysz nie przestanie się poruszać.GIF zatrzymuje animację, gdy mysz do gier się porusza.

Ten tylko dzieje się z myszy do gier z kierowcą na MacOS (testowałem go z Rocket-Kone xtd i myszy dla graczy Razer na dwóch komputerach). Kiedy używam innych myszy, wszystko działa dobrze.

Myszy do gier powodują również, że javax.swing.Timer s przestaje wywoływać ich metody actionPerformed(). I opened a thread here dla tego problemu, ale można to rozwiązać, używając zamiast tego java.util.TimerTask. (Edit: Właściwie TimerTask również nie naprawić, ponieważ JFrame nie przemalować aż myszka przestanie się poruszać.)

Ale nie znalazłem alternatywę dla animacji GIF. Jestem bardziej zainteresowany rozwiązaniem problemu, zamiast korzystać z alternatyw, choć byłbym wdzięczny za działającą alternatywę.

Kod:

import java.lang.reflect.InvocationTargetException; 

import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class Mouse { 
    public static void main(String[] args) { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        new Mouse(); 
       } 

      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Mouse() { 
     JFrame frame = new JFrame(); 
     JLabel label = new JLabel(new ImageIcon(getClass().getResource("waiting.gif"))); 

     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     frame.add(label); 
    } 
} 

Uruchamianie aplikacji:

enter image description here

MCVE:

import java.lang.reflect.InvocationTargetException; 
import java.net.*; 
import javax.swing.*; 

public class Mouse { 
    public static void main(String[] args) { 
     try { 
      SwingUtilities.invokeAndWait(new Runnable() { 
       public void run() { 
        try { 
         new Mouse(); 
        } catch (MalformedURLException ex) { 
         ex.printStackTrace(); 
        } 
       } 

      }); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public Mouse() throws MalformedURLException { 
     JFrame frame = new JFrame(); 
     JLabel label = new JLabel(new ImageIcon(
       new URL("https://i.stack.imgur.com/HXCUV.gif"))); 

     frame.setSize(500, 500); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 

     frame.add(label); 
    } 
} 
+1

Dodałem [mcve] jako edycję. Czy widzisz to samo zachowanie w MCVE? –

+0

Tak, to nie ma znaczenia. – Yakuhzi

+0

Huh .. to działa dobrze tutaj. Wstaw trochę kodu do przykładu, aby zrzucić wersję Java/mikro-wersję JRE. –

Odpowiedz

1

I rozwiązać problem jak ja zmniejszył odpytywania walut mojej myszki od 1000Hz do 500 Hz. Teraz wszystko działa idealnie. Myślę, że problem polegał na tym, że wątek UI był nadmiernie rozbudowywany i obsługiwał 1000 sond na sekundę, więc było zajęte animacją GIF.