2016-11-22 4 views
7

Пока я перемещаю свою игровую мышь внутри javax.swing.JFrame, все анимированные GIF-файлы (внутри javax.swing.JLabel) останавливают анимацию, пока мышь не перестанет двигаться.GIF останавливает анимацию при перемещении игровой мыши

Это только происходит с игровой мыши с водителем на Macos (тестировал с Ракетно-Kone XTD и игровой мыши Razer на двух компьютерах). Когда я использую других мышей, все работает нормально.

Игровые мыши также вызывают javax.swing.Timer s, чтобы прекратить называть их методы actionPerformed(). I opened a thread here для этой проблемы, но это можно решить, используя вместо этого java.util.TimerTask. (Редактировать: На самом деле TimerTask также не исправляет это, потому что JFrame не перерисовывает, пока мышь не перестает перемещаться.)

Но я не нашел альтернативы для анимации GIF. Меня больше интересует решение проблемы вместо использования альтернатив, хотя я был бы благодарен за рабочую альтернативу.

Код:

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); 
    } 
} 

Запуска приложение:

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

Я добавил [mcve] в качестве редактирования. Вы видите такое же поведение в MCVE? –

+0

Да, это не имеет значения. – Yakuhzi

+0

Huh .. он отлично работает здесь. Поместите некоторый код в примере, чтобы сбрасывать версию Java/версию для JRE. –

ответ

1

Я решил проблему, как я уменьшил избирательную скорость моей мыши от 1000Ца до 500 Гц. Теперь все работает отлично. Я думаю, проблема заключалась в том, что UI-Thread был слишком расширен, обрабатывая 1000 опросов в секунду, поэтому он был занят, чтобы анимировать GIF.

Смежные вопросы