Java 8, Swing und OSX: Dialoge bewirken, dass UI nicht mehr auf Maus reagiert

8

Ok, das ist ein wirklich, WIRKLICH seltsames Problem, das wir mit der Anwendung in meiner Firma haben. Ich werde versuchen, dies so gut wie möglich zu beschreiben.

Erstens ist dies eine Legacy-Anwendung mit einer Swing-Benutzeroberfläche.

Zweitens tritt das Problem nur auf, wenn es kompiliert & amp; Führen Sie Java 8 aus. Mit Java 7 und niedriger tritt dies nicht auf.

Das Problem: Wenn ein Dialogfeld angezeigt wird (modal oder nicht-modal, spielt keine Rolle), reagiert die Benutzeroberfläche nicht mehr auf Mausklicks. Was wirklich verrückt ist, ist, dass die Benutzeroberfläche nicht eingefroren ist. Wenn Sie die Maus über etwas bewegen, wird die Hover-Hervorhebung normal angezeigt. Tastaturbefehle werden perfekt empfangen. Mausklicks funktionieren jedoch nicht.

Dies tritt auch nur unter OSX auf. Windows und Linux haben dieses Problem nicht. Ich betreibe dies auf OSX El Capitan.

Soweit Code-Beispiele betroffen sind, wirkt sich dies auf alle Dialoge in der gesamten Anwendung aus. JOptionPanes & amp; JDialogs scheint nicht wichtig zu sein. Hier ist eine einfache JOptionPane-Deklaration:

%Vor%

Dieser Code wird im EventThread aufgerufen, daher glaube ich nicht, dass es sich um ein Threading-Problem handelt.

Ich bin völlig ratlos, was die Ursache dafür angeht. Bis jetzt haben wir es ignoriert, indem wir es in Java 7 kompiliert und ausgeführt haben, aber irgendwann im Verlauf der Versionen müssen wir uns mit diesem Problem direkter befassen.

Hat jemand Ideen?

Bearbeiten: Danke für die SSCCE-Idee. Jetzt bin ich mehr verwirrt als je zuvor. Als ich eine schnelle Frame / Dialog-Demonstration zusammenstellte, funktionierte es perfekt. Keine Probleme. Also ich weiß nicht, was es in der Anwendung ist, die das verursachen könnte. Irgendwelche guten Plätze, um anzufangen, zu schauen?

Edit 2: Wrapped eine der Deklarationen in SwingUtilities.invokeLater, und es hat funktioniert. Ok ... was könnte der Schuldige sein? Es muss immer noch etwas sein, das Java 8 anders kompiliert als Java 7.

Edit 3: Mehr seltsames Verhalten. Ich habe meine IDE in einen separaten "Desktop" als die Anwendung, die es ausführte, verschoben, und wenn das fehlerhafte Dialogfeld angezeigt wird, kann ich nicht zu diesem Desktop wechseln. Ich kann zu jeder App auf dem aktuellen Desktop wechseln, aber nicht zu einem anderen Desktop.

Bearbeiten 4: Die betreffenden Dialoge werden durch Ziehen und Ablegen ausgelöst. Nicht sicher, ob das hilft oder nicht, aber ich sehe, dass im Thread-Dump ein Thread mit der Klasse sun.lwawt.macosx.CDragSourceContextPeer im Hintergrund ist.

    
user2223059 24.03.2016, 17:33
quelle

1 Antwort

2

Okay, es hat eine Weile gedauert, aber ich glaube, ich habe es gefunden. Ich habe einen OpenJDK-Beitrag gefunden, der dieses Problem sehr deutlich zu beschreiben scheint.

Ссылка

Irgendwie lässt Drag N Drop in Swing auf OSX in Java 8 den MouseEvent oder Listener nicht los. Wenn also ein modales Dialogfeld angezeigt wird, kann die Maus keine neuen Events erhalten. Was ein verrückter dummer Käfer ist, aber er ist da.

Die Lösung hat meinen Code in SwingUtilities.invokeLater (...) verpackt. Durch den Code, der die Dialoge anzeigt, die asynchron aus dem Drag-and-Drop-Code ausgeführt werden, kann die Drag-and-Drop-Operation die Mausverbindung beenden und freigeben (mangels einer besseren Beschreibung). Und Viola! Problem gelöst.

Danke an alle, die versucht haben zu helfen. Ich hoffe, dieser Beitrag hilft jedem, der sich mit diesem Thema beschäftigt.

    
user2223059 24.03.2016, 19:26
quelle

Tags und Links