Java Swing JWindow 应用程序崩溃

Posted

技术标签:

【中文标题】Java Swing JWindow 应用程序崩溃【英文标题】:Java Swing JWindow application crash 【发布时间】:2015-07-16 08:41:51 【问题描述】:

如果我使用 JDK1.8_40 或更新版本(Oracle 或 OpenJDK 也这样做),以下代码和对话框调整大小将导致应用程序崩溃(尝试 Windows 7、x64、64 位 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;


我还没有发现其他关于此的投诉,也没有在 oracle 的网站上发布错误。一种可能的解决方法是将 JWindow 更改为未装饰的 JDialog,但这对我来说还有其他问题,所以我不会更改它。

有没有其他人遇到过这个问题并找到了解决方法?

添加堆栈:

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 问题详情(显示 2 个错误):

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

第二个:

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

【问题讨论】:

你有什么例外吗? 不,整个 JVM 崩溃了。我可以重现这个。本机代码中可能存在一些错误。 没有例外,但我确实设法在崩溃前打印了一个堆栈。我会在一小时内发布它。如果我没记错的话,它以 WWindowPeer 的本机方法 reshapeFrame 结束 JDK1.8.0 在 Windows 7 64 位上运行良好,但 JDK1.8.0_11 崩溃。 添加了我在崩溃之前能够获得的堆栈 【参考方案1】:

这个答案有点晚了,but the issue has been fixed。

【讨论】:

【参考方案2】:

您的计时器未在 Swing UI 线程上调度 Swing UI 事件。您需要“invokeLater”您的可运行文件,以便它在正确的线程上运行。

或者,您可以让计时器执行 SwingWorker,并使用 done() 方法发布事件(保证在事件调度线程上)

【讨论】:

我猜你说的是 actionPerformed 方法。那个在 AWT-EventQueue-0 上调用。

以上是关于Java Swing JWindow 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在不闪烁的情况下调整 Swing JWindow 的大小?

Java中如何实现进度条效果

Java中如何实现进度条效果

java如何衔接不同文件中的swing组件

基于 Swing 的加载框架挂在 DB 查询上

如何请求 JWindow 临时焦点? (Java 1.7)