2016-03-24 29 views
8

Ok, questo è davvero un problema davvero strano che stiamo riscontrando con l'applicazione presso la mia azienda. Cercherò di descrivere questo come meglio posso.Java 8, Swing e OSX: le finestre di dialogo rendono l'interfaccia utente non rispondente al mouse.

Innanzitutto, questa è un'applicazione legacy con un'interfaccia utente Swing.

In secondo luogo, il problema si verifica solo quando è compilato & eseguito utilizzando Java 8. Con Java 7 e versioni successive, ciò non si verifica.

Quindi, il problema: quando viene visualizzata una finestra di dialogo (modale o non modale, non importa), l'interfaccia utente non risponde ai clic del mouse. Ciò che è veramente pazzesco, però, è che l'interfaccia utente NON è congelata. Passare il mouse su qualcosa produce normalmente l'evidenziazione al passaggio del mouse. I comandi della tastiera sono ricevuti perfettamente. I clic del mouse, tuttavia, non funzionano.

Anche questo si verifica solo su OSX. Windows e Linux non hanno questo problema. Sto eseguendo questo su OSX El Capitan.

Per quanto riguarda gli esempi di codice, interessa tutte le finestre di dialogo dell'applicazione. JOptionPanes & JDialogs, non sembra importare. Ecco una semplice dichiarazione JOptionPane:

int n = JOptionPane.showOptionDialog(mcContext.getMapperView(), "xPath of dropping target can't be evaluated" + 
         "\nPlease, select xPath for dropped node", 
         "xPath calculation for dropped node", 
         JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]); 

Questo codice viene chiamato sul EventThread, quindi non credo che sia un problema di threading.

Sono totalmente sconcertato per la causa di questo. Finora l'abbiamo ignorato compilando ed eseguendolo in Java 7, ma a un certo punto man mano che le versioni avanza avremo bisogno di affrontare questo problema in modo più diretto.

Qualcuno ha qualche idea?

Modifica: Grazie per l'idea SSCCE. Ora sono più confuso che mai. Quando ho messo insieme una veloce dimostrazione frame/dialog, ha funzionato perfettamente. Senza problemi. Quindi non so cosa sia l'applicazione che potrebbe causare questo. Qualche buon posto per iniziare a cercare?

Modifica 2: ha avvolto una delle dichiarazioni in SwingUtilities.invokeLater e ha funzionato. Ok ... ora quale potrebbe essere il colpevole? Dev'essere ancora qualcosa che Java 8 sta compilando diverso da Java 7.

Modifica 3: comportamento più strano. Ho spostato il mio IDE in un "desktop" separato rispetto all'applicazione in esecuzione e, quando viene visualizzata la finestra di dialogo con errori, non posso passare a quel desktop. Posso passare a qualsiasi app sul desktop corrente, ma non a un altro desktop.

Modifica 4: le finestre di dialogo in questione vengono attivate mediante azioni di trascinamento della selezione. Non sono sicuro se questo aiuti o meno, ma vedo che c'è un thread in background nel dump dei thread usando la classe sun.lwawt.macosx.CDragSourceContextPeer.

+2

Si può scrivere un SSCCE (esempio semplice, autonomo, compilabile) per quello? – fge

+0

E qualsiasi registro/traccia stack rilevante (sia Java che forse anche la console mac)? – Mena

+0

Per quanto riguarda i registri/tracce dello stack, non ci sono eccezioni generate e la registrazione dell'applicazione viene emessa normalmente, come se nulla fosse sbagliato. Per quanto riguarda un SSCCE, vedrò cosa posso fare. – user2223059

risposta

2

OK, ci è voluto un po ', ma penso di averlo trovato. Ho trovato un post OpenJDK che sembrava descrivere molto chiaramente questo problema.

https://bugs.openjdk.java.net/browse/JDK-8139393

In qualche modo, drag'n'drop in Swing su OSX in Java 8 non sta rilasciando la sua presa sul MouseEvent o l'ascoltatore, in modo che quando una finestra di dialogo modale viene visualizzato il mouse non è in grado di ottenere nuovi eventi attraverso ad esso. Che è un insetto pazzo stupido, ma è lì.

La soluzione era il wrapping del mio codice in SwingUtilities.invokeLater (...).Avendo il codice che visualizza le finestre di dialogo eseguite in modo asincrono dal codice di trascinamento della selezione, l'operazione di trascinamento della selezione è in grado di completare e rilasciare la sua presa sulla connettività del mouse (per mancanza di una descrizione migliore). E viola! Problema risolto.

Grazie a tutti coloro che hanno cercato di aiutare. Spero che questo post aiuti qualcun altro che si occupa di questo problema.