2015-05-06 16 views
14

Se uso JDK1.8_40 o più recente (Oracle o OpenJDK fare lo stesso), il codice seguente insieme a una finestra di dialogo di ridimensionamento andrà in crash l'applicazione (provato Windows 7, 64, 64 bit JDK)Java Swing crash dell'applicazione JWindow

import javax.swing.JButton; 
import javax.swing.JDialog; 
import javax.swing.JPanel; 
import javax.swing.JWindow; 
import javax.swing.SwingUtilities; 
import javax.swing.Timer; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

public class Main { 

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      final JDialog dialog = new JDialog(); 
      dialog.add(new JPanel()); 
      dialog.setVisible(true); 
      dialog.setBounds(100, 100, 100, 100); 

      final JWindow dependentWindow = getjWindow(dialog); 
      dependentWindow.setVisible(true); 
      dependentWindow.setBounds(100, 100, 100, 100); 
      Timer t = new Timer(300, new ActionListener() { 
       @Override 
       public void actionPerformed(ActionEvent e) { 
        dependentWindow.setVisible(!dependentWindow.isVisible()); 
       } 
      }); 
      t.start(); 
     } 
    }); 
} 

private static JWindow getjWindow(JDialog dialog) { 
    JWindow w = new JWindow(dialog); 
    JPanel panel = new JPanel(); 
    panel.add(new JButton("button")); 
    w.add(panel); 
    return w; 
} 
} 

Non ho trovato altri reclami a riguardo e non ho ancora postato un bug sul sito di oracle. Una possibile soluzione alternativa sta nel cambiare la JWindow in un JDialog non decorato, ma questo mi porta ad altri problemi, quindi non lo cambierei ancora.

Qualcun altro ha riscontrato questo problema e ha trovato una soluzione alternativa?

Aggiunto stack:

WARN 2015-05-04 15:21:21,707 - AWT-EventQueue-0, Id = 17, Priority = 6: RUNNABLE 
sun.awt.windows.WWindowPeer.reshapeFrame(Native Method) 
sun.awt.windows.WDialogPeer.reshape(Unknown Source) 
sun.awt.windows.WComponentPeer.setBounds(Unknown Source) 
sun.awt.windows.WWindowPeer.setBounds(Unknown Source) 
java.awt.Component.reshapeNativePeer(Unknown Source) 
java.awt.Component.reshape(Unknown Source) 
java.awt.Window.reshape(Unknown Source) 
java.awt.Component.setBounds(Unknown Source) 
java.awt.Window.setBounds(Unknown Source) 
java.awt.Component.resize(Unknown Source) 
java.awt.Component.setSize(Unknown Source) 
java.awt.Window.setSize(Unknown Source) 

di Windows particolari di problema (spettacoli 2 errori):

Problem signature: 
Problem Event Name: BEX64 
Application Name: java.exe 
Application Version: 8.0.60.13 
Application Timestamp: 55404a69 
Fault Module Name: StackHash_08b3 
Fault Module Version: 0.0.0.0 
Fault Module Timestamp: 00000000 
Exception Offset: 0000000300000002 
Exception Code: c0000005 
Exception Data: 0000000000000008 
OS Version: 6.1.7601.2.1.0.256.48 
Locale ID: 1033 
Additional Information 1: 08b3 
Additional Information 2: 08b36dcca93c38acb7c92ef4a729e798 
Additional Information 3: 5d68 
Additional Information 4: 5d682eddcc7a5d6b5452fc95535d5ac9 

seconda:

Problem signature: 
Problem Event Name: APPCRASH 
Application Name: java.exe 
Application Version: 8.0.60.13 
Application Timestamp: 55404a69 
Fault Module Name: StackHash_d693 
Fault Module Version: 0.0.0.0 
Fault Module Timestamp: 00000000 
Exception Code: c000041d 
Exception Offset: 0000000300000002 
OS Version: 6.1.7601.2.1.0.256.48 
Locale ID: 1033 
Additional Information 1: d693 
Additional Information 2: d6933f192f50114566e03a88a59a6417 
Additional Information 3: 9096 
Additional Information 4: 9096dfe271c183defc2620e74bdaec28 
+0

Avete qualche eccezione? – alex2410

+1

No, l'intera JVM si arresta in modo anomalo. Posso riprodurre questo. Probabilmente qualche bug nel codice nativo. –

+1

Nessuna eccezione, ma sono riuscito a stampare una pila subito prima del crash. Lo posterò tra un'ora. Finì con il metodo nativo reshapeFrame di WWindowPeer se ricordo bene –

risposta

1

il timer non sta inviando gli eventi swing UI sulla discussione dell'interfaccia utente di Swing. È necessario "invokeLater" eseguibile in modo che venga eseguito sul thread corretto.

In alternativa, si potrebbe avere il timer eseguire uno SwingWorker, con il metodo fatto() inviare l'evento (che è garantito per essere sul filo di spedizione evento)

+0

Immagino che tu stia parlando del metodo actionPerformed. Quello è chiamato su AWT-EventQueue-0. –