2016-11-22 21 views
7

Trong khi tôi di chuyển chuột chơi game của mình bên trong javax.swing.JFrame, tất cả các ảnh động GIF (javax.swing.ImageIcon bên trong một javax.swing.JLabel) ngừng hoạt ảnh cho đến khi chuột ngừng di chuyển.GIF ngừng hoạt ảnh khi chuột di chuyển đang di chuyển

này chỉ xảy ra với một con chuột chơi game với một trình điều khiển trên MacOS (thử nghiệm nó với một XTD Rocket-Kone và một con chuột chơi game Razer trên hai máy tính). Khi tôi sử dụng những con chuột khác, mọi thứ đều hoạt động tốt.

Chuột chơi game cũng gây ra javax.swing.Timer giây để dừng gọi các phương thức actionPerformed() của chúng. I opened a thread here cho vấn đề này, nhưng điều này có thể được giải quyết bằng cách sử dụng java.util.TimerTask thay thế. (Chỉnh sửa: Trên thực tế TimerTask cũng không khắc phục được vì JFrame không sơn lại cho đến khi con trỏ ngừng di chuyển.)

Nhưng tôi không tìm thấy thay thế cho hoạt ảnh GIF. Tôi quan tâm nhiều hơn để giải quyết vấn đề thay vì sử dụng các lựa chọn thay thế mặc dù tôi sẽ biết ơn vì một giải pháp thay thế.

Code:

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

Chạy ứng dụng:

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

Tôi đã thêm [mcve] làm bản chỉnh sửa. Bạn có thấy hành vi tương tự trong MCVE không? –

+0

Yep nó không tạo sự khác biệt. – Yakuhzi

+0

Huh .. nó hoạt động tốt ở đây. Đặt một số mã trong ví dụ để kết xuất phiên bản Java/phiên bản vi mô của JRE. –

Trả lời

1

tôi giải quyết vấn đề như tôi giảm polling-tốc độ chuột của tôi từ 1000Hz đến 500Hz. Bây giờ mọi thứ hoạt động hoàn hảo. Tôi nghĩ rằng vấn đề là UI-Thread đã được xử lý quá mức xử lý 1000 cuộc thăm dò mỗi giây để nó bận rộn để tạo ảnh động cho GIF.

Các vấn đề liên quan