Java Swing JWindow application crash
Asked Answered
G

2

15

If I use JDK1.8_40 or newer (Oracle or OpenJDK do the same), the following code together with a dialog resize will crash the application (tried Windows 7, x64, 64bit JDK)

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

I haven't found other complaints about this and haven't posted a bug on oracle's website yet. A possible workaround is changing the JWindow to an undecorated JDialog but that comes with other issues for me so I wouldn't change this yet.

Did anyone else hit this problem and found a workaround?

Added the 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)

Windows problem details (shows 2 errors):

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

second one:

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
Garnish answered 6/5, 2015 at 9:34 Comment(5)
Do you have any exception?Periosteum
No, the whole JVM crashes. I can reproduce this. Likely some bug in native code.Comminute
No exceptions but I did manage to print a stack right before the crash. I'll post it in one hour. It ended in the native method reshapeFrame from WWindowPeer if I remember correctlyGarnish
JDK1.8.0 on Windows 7 64bit works fine, but JDK1.8.0_11 crashing.Buffington
Added the stack I was able to get before the crashGarnish
G
1

A bit late with this answer, but the issue has been fixed.

Garnish answered 14/4, 2019 at 14:20 Comment(0)
K
0

Your Timer is not dispatching the Swing UI events on the Swing UI Thread. You need to "invokeLater" your runnable so it gets ran on the right thread.

Alternatively, you could have the timer execute a SwingWorker, with the done() method posting the event (it is guaranteed to be on the event dispatch thread)

Kurt answered 10/9, 2015 at 14:28 Comment(1)
I'm guessing you're talking about the actionPerformed method. That one is called on AWT-EventQueue-0.Garnish

© 2022 - 2024 — McMap. All rights reserved.