如果我使用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
这个答案有点晚了,but the issue has been fixed。
您的Timer不会在Swing UI线程上调度Swing UI事件。你需要“invokeLater”你的runnable所以它在正确的线程上运行。
或者,您可以让计时器执行SwingWorker,使用done()方法发布事件(保证在事件派发线程上)