当Swing应用程序在双显示器计算机上运行时切换“镜像显示”时会出现持续可重现的崩溃,然后立即覆盖具有工具提示的内容。
我只在OS X 10.8上看到这个。我无法在10.7上重现它。
再次将鼠标悬停在JLabel上,您应该会崩溃。
public class TestToolTip {
public static void main(String[] args) {
JFrame frame = new JFrame();
JLabel label = new JLabel("hover");
label.setToolTipText("tooltip text");
frame.add(label);
frame.setVisible(true);
frame.pack();
}
}
在正在运行的应用程序上关闭笔记本电脑而不是“镜像开启”步骤时,我也看到了这一点。
PlugIn Path: /Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home/jre/lib/lwawt/liblwawt.dylib
PlugIn Identifier: liblwawt.dylib
PlugIn Version: ??? (1)
Date/Time: 2013-07-04 12:09:43.467 -0400
OS Version: Mac OS X 10.8.2 (12C60)
Report Version: 10
Interval Since Last Report: 6164497 sec
Crashes Since Last Report: 67
Per-App Interval Since Last Report: 23880 sec
Per-App Crashes Since Last Report: 2
Crashed Thread: 0 AppKit Thread Dispatch queue: com.apple.main-thread
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Application Specific Information:
*** CFRelease() called with NULL ***
Thread 0 Crashed:: AppKit Thread Dispatch queue: com.apple.main-thread
0 com.apple.CoreFoundation 0x00007fff8513e7d8 CFRelease + 40
1 liblwawt.dylib 0x0000000168eae647 __Java_sun_lwawt_macosx_CWrapper_00024NSObject_release_block_invoke_1 + 91
2 JavaNativeFoundation 0x00000001682d55f5 +[JNFRunLoop _performCopiedBlock:] + 20
3 com.apple.Foundation 0x00007fff88d31677 __NSThreadPerformPerform + 225
4 com.apple.CoreFoundation 0x00007fff85148101 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
5 com.apple.CoreFoundation 0x00007fff85147a25 __CFRunLoopDoSources0 + 245
6 com.apple.CoreFoundation 0x00007fff8516adc5 __CFRunLoopRun + 789
7 com.apple.CoreFoundation 0x00007fff8516a6b2 CFRunLoopRunSpecific + 290
8 com.apple.HIToolbox 0x00007fff901410a4 RunCurrentEventLoopInMode + 209
9 com.apple.HIToolbox 0x00007fff90140e42 ReceiveNextEventCommon + 356
10 com.apple.HIToolbox 0x00007fff90140cd3 BlockUntilNextEventMatchingListInMode + 62
11 com.apple.AppKit 0x00007fff8dc19613 _DPSNextEvent + 685
12 com.apple.AppKit 0x00007fff8dc18ed2 -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 128
13 libosxapp.dylib 0x0000000168f2fb56 -[NSApplicationAWT nextEventMatchingMask:untilDate:inMode:dequeue:] + 124
14 com.apple.AppKit 0x00007fff8dc10283 -[NSApplication run] + 517
15 libosxapp.dylib 0x0000000168f2f9b9 +[NSApplicationAWT runAWTLoopWithApp:] + 156
16 liblwawt.dylib 0x0000000168e8981a -[AWTStarter starter:] + 1591
17 com.apple.Foundation 0x00007fff88d31677 __NSThreadPerformPerform + 225
18 com.apple.CoreFoundation 0x00007fff85148101 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
19 com.apple.CoreFoundation 0x00007fff85147a25 __CFRunLoopDoSources0 + 245
20 com.apple.CoreFoundation 0x00007fff8516adc5 __CFRunLoopRun + 789
21 com.apple.CoreFoundation 0x00007fff8516a6b2 CFRunLoopRunSpecific + 290
22 java 0x0000000102a8842d CreateExecutionEnvironment + 871
23 java 0x0000000102a82bdc JLI_Launch + 1952
24 java 0x0000000102a8878a main + 101
25 java 0x0000000102a82434 start + 52
Thread 1:
0 libsystem_kernel.dylib 0x00007fff8bf70386 __semwait_signal + 10
1 libsystem_c.dylib 0x00007fff884eacbd pthread_join + 847
2 java 0x0000000102a87a2d ContinueInNewThread0 + 102
3 java 0x0000000102a83847 ContinueInNewThread + 201
4 java 0x0000000102a87790 JVMInit + 251
5 java 0x0000000102a835c5 JLI_Launch + 4489
6 java 0x0000000102a8878a main + 101
7 java 0x0000000102a880bf apple_main + 92
8 libsystem_c.dylib 0x00007fff88460742 _pthread_start + 327
9 libsystem_c.dylib 0x00007fff8844d181 thread_start + 13
Thread 2:
0 libsystem_kernel.dylib 0x00007fff8bf700fa __psynch_cvwait + 10
1 libsystem_c.dylib 0x00007fff88464f89 _pthread_cond_wait + 869
2 libjvm.dylib 0x0000000102f5c547 os::PlatformEvent::park() + 173
3 libjvm.dylib 0x0000000102f3f7bc ParkCommon(ParkEvent*, long long) + 42
4 libjvm.dylib 0x0000000102f3ffae Monitor::IWait(Thread*, long long) + 160
5 libjvm.dylib 0x0000000102f4018a Monitor::wait(bool, long, bool) + 246
6 libjvm.dylib 0x0000000103023168 Threads::destroy_vm() + 80
7 libjvm.dylib 0x0000000102e4e2ba jni_DestroyJavaVM + 223
8 java 0x0000000102a83b86 JavaMain + 805
9 libsystem_c.dylib 0x00007fff88460742 _pthread_start + 327
10 libsystem_c.dylib 0x00007fff8844d181 thread_start + 13
Thread 3:: Dispatch queue: com.apple.libdispatch-manager
0 libsystem_kernel.dylib 0x00007fff8bf70d16 kevent + 10
1 libdispatch.dylib 0x00007fff84e84dea _dispatch_mgr_invoke + 883
2 libdispatch.dylib 0x00007fff84e849ee _dispatch_mgr_thread + 54
Thread 4:
0 libsystem_kernel.dylib 0x00007fff8bf700fa __psynch_cvwait + 10
1 libsystem_c.dylib 0x00007fff88464f89 _pthread_cond_wait + 869
2 libjvm.dylib 0x0000000102f5c547 os::PlatformEvent::park() + 173
3 libjvm.dylib 0x0000000102f3f7bc ParkCommon(ParkEvent*, long long) + 42
4 libjvm.dylib 0x0000000102f3ffae Monitor::IWait(Thread*, long long) + 160
5 libjvm.dylib 0x0000000102f4020b Monitor::wait(bool, long, bool) + 375
6 libjvm.dylib 0x0000000102dcd516 GCTaskManager::get_task(unsigned int) + 56
7 libjvm.dylib 0x0000000102dce34e GCTaskThread::run() + 338
8 libjvm.dylib 0x0000000102f601b5 java_start(Thread*) + 173
9 libsystem_c.dylib 0x00007fff88460742 _pthread_start + 327
10 libsystem_c.dylib 0x00007fff8844d181 thread_start + 13
Thread 5:
0 libsystem_kernel.dylib 0x00007fff8bf700fa __psynch_cvwait + 10
1 libsystem_c.dylib 0x00007fff88464f89 _pthread_cond_wait + 869
2 libjvm.dylib 0x0000000102f5c547 os::PlatformEvent::park() + 173
3 libjvm.dylib 0x0000000102f3f7bc ParkCommon(ParkEvent*, long long) + 42
4 libjvm.dylib 0x0000000102f3ffae Monitor::IWait(Thread*, long long) + 160
5 libjvm.dylib 0x0000000102f4020b Monitor::wait(bool, long, bool) + 375
6 libjvm.dylib 0x0000000102dcd516 GCTaskManager::get_task(unsigned int) + 56
7 libjvm.dylib 0x0000000102dce34e GCTaskThread::run() + 338
8 libjvm.dylib 0x0000000102f601b5 java_start(Thread*) + 173
9 libsystem_c.dylib 0x00007fff88460742 _pthread_start + 327
10 libsystem_c.dylib 0x00007fff8844d181 thread_start + 13
Thread 6:
0 libsystem_kernel.dylib 0x00007fff8bf700fa __psynch_cvwait + 10
1 libsystem_c.dylib 0x00007fff88464f89 _pthread_cond_wait + 869
2 libjvm.dylib 0x0000000102f5d6b3 os::PlatformEvent::park(long long) + 385
3 libjvm.dylib 0x0000000102f3ffae Monitor::IWait(Thread*, long long) + 160
4 libjvm.dylib 0x0000000102f4020b Monitor::wait(bool, long, bool) + 375
5 libjvm.dylib 0x0000000103053f2c VMThread::loop() + 444
答案 0 :(得分:0)
我没有针对这个确切问题的解决方案,但也许是一个有助于找到解决方案的根本原因,因为我遇到了类似的问题。根本原因可能是这个错误:
https://bugs.openjdk.java.net/browse/JDK-8057833
Swing背后AWT位于AWT后面,有一个针对各自操作系统的本机实现(在你的情况下是mac os X)。本机实现是通过所谓的“本地”从Java调用的。调用(这是Java中的一个关键字,正常的程序员不接触它)。由于本机实现中的事件/操作具有针对多个本机调用保留的状态,因此可能出现此问题(CFRelease() called with NULL
)。不幸的是,在Java在objective-c核心基础中创建相应的发布之前,状态被重置,因此当最终来自Java的调用到来时,相应的值已经消失。
我遇到了jdk1.7.0_67,jdk1.8.0_20和jdk1.8.0_45这个问题,因为我有一个DropAction
(用于拖放),它按顺序打开JDialog
更多地控制"如何放弃"。由于对话框在放置事件完成之前触发了新事件,因此核心基础中的状态过早消失。解决方案是通过JDialog
推迟打开SwingUtilities.invokeLater(Runnable)
的代码,以便在完成事件后执行。
由于您正在主线程中执行GUI内容(而不是Event Dispatching Thread),所以无论如何都应该这样做:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
JLabel label = new JLabel("hover");
label.setToolTipText("tooltip text");
frame.add(label);
frame.setVisible(true);
frame.pack();
}
});
}
问题本身是核心基础的本机实现中的错误,或者是Java实现中核心基础API的使用。因此,如果您仍然遇到此问题,则应在打开的JDK的错误跟踪器中提交错误。