Swing, Exception Remote Desktop

Mon application Swing semble ArrayIndexOutOfBounds exceptions ArrayIndexOutOfBounds lorsque j’utilise Windows Remote Desktop pour me connecter à un PC sur lequel mon application s’exécute. Une idée de ce qui pourrait causer cela?

 Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 3 at sun.awt.Win32GraphicsEnvironment.getDefaultScreenDevice(Win32GraphicsEnvironment.java:96) at sun.awt.windows.WWindowPeer.updateGC(WWindowPeer.java:470) at sun.awt.windows.WWindowPeer.displayChanged(WWindowPeer.java:508) at sun.awt.windows.WWindowPeer$1.run(WWindowPeer.java:448) at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:733) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue.java:694) at java.awt.EventQueue$3.run(EventQueue.java:692) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87) at java.awt.EventQueue$4.run(EventQueue.java:708) at java.awt.EventQueue$4.run(EventQueue.java:706) at java.security.AccessController.doPrivileged(Native Method) at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) at java.awt.EventQueue.dispatchEvent(EventQueue.java:705) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138) at java.awt.EventDispatchThread.run(EventDispatchThread.java:91) 

Je l’ai vu deux fois à distance dans le PC, mais je ne l’ai jamais vu dans d’autres situations. Étant donné que tout cela est interne au JDK Sun 7u25 de Java (regardez la trace de la stack ci-dessous), je ne suis même pas sûr de savoir comment procéder pour le déboguer. Pensées?


Autres informations : La machine dispose de deux cartes graphiques avec deux ports de moniteur sur chacun et Windows est configuré pour que les quatre écrans soient allumés. Cependant, lorsque je suis à distance dans la machine, il n’y a évidemment qu’un seul moniteur. Le moniteur avec le menu Démarrer (et le moniteur qui contient l’application) est identifié comme moniteur n ° 4 par Windows.

System.getProperties().list(System.out); :

 -- listing properties -- java.runtime.name=Java(TM) SE Runtime Environment sun.boot.library.path=D:\Program Files\Java\jdk1.7.0_25\jre... java.vm.version=23.25-b01 java.vm.vendor=Oracle Corporation java.vendor.url=http://java.oracle.com/ path.separator=; java.vm.name=Java HotSpot(TM) 64-Bit Server VM file.encoding.pkg=sun.io user.script= user.country=US sun.java.launcher=SUN_STANDARD sun.os.patch.level=Service Pack 1 java.vm.specification.name=Java Virtual Machine Specification user.dir=C:\Code\workspace\client java.runtime.version=1.7.0_25-b16 java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment java.endorsed.dirs=D:\Program Files\Java\jdk1.7.0_25\jre... os.arch=amd64 java.io.tmpdir=XXXXXXXXXXXXXXXXXXXXXXXXXXXX line.separator= java.vm.specification.vendor=Oracle Corporation user.variant= os.name=Windows 7 sun.jnu.encoding=Cp1252 java.library.path=D:\Program Files\Java\jdk1.7.0_25\bin... java.specification.name=Java Platform API Specification java.class.version=51.0 sun.management.comstackr=HotSpot 64-Bit Tiered Comstackrs os.version=6.1 user.home=XXXXXXXXXXXXXXXXXXXXXXXXX user.timezone= java.awt.printerjob=sun.awt.windows.WPrinterJob file.encoding=Cp1252 java.specification.version=1.7 user.name=XXXXXXXXXXXXXXXXXXXXXXXXX java.class.path=C:\Code\workspace\client\target\class... java.vm.specification.version=1.7 sun.arch.data.model=64 java.home=D:\Program Files\Java\jdk1.7.0_25\jre sun.java.command=com.techemet.client.ClientMain java.specification.vendor=Oracle Corporation user.language=en awt.toolkit=sun.awt.windows.WToolkit java.vm.info=mixed mode java.version=1.7.0_25 java.ext.dirs=D:\Program Files\Java\jdk1.7.0_25\jre... sun.boot.class.path=D:\Program Files\Java\jdk1.7.0_25\jre... java.vendor=Oracle Corporation file.separator=\ java.vendor.url.bug=http://bugreport.sun.com/bugreport/ sun.cpu.endian=little sun.io.unicode.encoding=UnicodeLittle sun.desktop=windows sun.cpu.isalist=amd64 

Le document de Sun pour le bogue JDK-4417798 (celui que vous avez mentionné dans votre dernier commentaire) décrit un moyen d’ attraper l’exception . Citation du document:

 public class BugHandler { public void handle(Throwable throwable) { if (e instanceof ArrayIndexOutOfBoundsException) { StackTraceElement[] trace = e.getStackTrace(); if (trace.length > 1 && trace[0].getClassName().equals("sun.awt.Win32GraphicsEnvironment") && trace[0].getMethodName().equals("getDefaultScreenDevice")) { your_code_to_handle_exception(); } } } } 

Il suggère également de définir l’option -Dsun.java2d.noddraw sur true . Selon cet autre document , cela désactive notre utilisation de DirectDraw et Direct3D . Voir si cela aide.

Vous pouvez également essayer de forcer l’application à s’exécuter sur un écran particulier, au lieu de compter sur la détection automatique de l’environnement graphique par Java. Il existe un exemple pertinent utilisant la classe GraphicsDevice dans la documentation de l’ API .