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 应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章