java - Apple AWT 内部异常 : NSWindow drag regions should only be invalidated on the Main Thread

标签 java macos macos-catalina

我正在尝试运行 PApplet 类。我在 Eclipse 上运行它,在 MacOS 中。所有必需的库文件都包含在应用程序中,并使用 Java 1.8 来编译和运行该类。
Mac OS 版本为 Catalina,10.15.6 (19G2021)。我收到以下错误:

    2020-10-13 13:23:51.528 java[20420:1238853] Apple AWT Internal Exception: NSWindow drag regions should only be invalidated on the Main Thread!
    2020-10-13 13:23:51.528 java[20420:1238853] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSWindow drag regions should only be invalidated on the Main Thread!'
    *** First throw call stack:
    (
    0   CoreFoundation                      0x00007fff338dbb57 __exceptionPreprocess + 250
    1   libobjc.A.dylib                     0x00007fff6c7245bf objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff3390434c -[NSException raise] + 9
    3   AppKit                              0x00007fff30afe5ec -[NSWindow(NSWindow_Theme) _postWindowNeedsToResetDragMarginsUnlessPostingDisabled] + 310
    4   AppKit                              0x00007fff30ae6052 -[NSWindow _initContent:styleMask:backing:defer:contentView:] + 1416
    5   AppKit                              0x00007fff30ae5ac3 -[NSWindow initWithContentRect:styleMask:backing:defer:] + 42
    6   libnativewindow_macosx.jnilib       0x000000015e4d8f9e Java_jogamp_nativewindow_macosx_OSXUtil_CreateNSWindow0 + 398
    7   ???                                 0x0000000112dad407 0x0 + 4611298311
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException
我写的引用代码。
package module1;
import processing.core.PApplet;
import de.fhpotsdam.unfolding.UnfoldingMap;
import de.fhpotsdam.unfolding.geo.Location;
import de.fhpotsdam.unfolding.providers.AbstractMapProvider;
import de.fhpotsdam.unfolding.providers.Google;
import de.fhpotsdam.unfolding.providers.MBTilesMapProvider;
import de.fhpotsdam.unfolding.utils.MapUtils;


    public class HelloWorld extends PApplet
    {
        /** Your goal: add code to display second map, zoom in, and customize the background.
         * Feel free to copy and use this code, adding to it, modifying it, etc.  
         * Don't forget the import lines above. */
    
        // You can ignore this.  It's to keep eclipse from reporting a warning
        private static final long serialVersionUID = 1L;
    
        /** This is where to find the local tiles, for working without an Internet connection */
        public static String mbTilesString = "blankLight-1-3.mbtiles";
        
        // IF YOU ARE WORKING OFFLINE: Change the value of this variable to true
        private static final boolean offline = false;
        
        /** The map we use to display our home town: La Jolla, CA */
        UnfoldingMap map1;
        
        /** The map you will use to display your home town */ 
        UnfoldingMap map2;
    
        public void setup() {
            size(800, 600, P2D);  // Set up the Applet window to be 800x600
                                  // The OPENGL argument indicates to use the 
                                  // Processing library's 2D drawing
                                  // You'll learn more about processing in Module 3
    
            // This sets the background color for the Applet.  
            // Play around with these numbers and see what happens!
            this.background(200, 200, 200);
            
            // Select a map provider
            AbstractMapProvider provider = new Google.GoogleTerrainProvider();
            // Set a zoom level
            int zoomLevel = 10;
            
            if (offline) {
                // If you are working offline, you need to use this provider 
                // to work with the maps that are local on your computer.  
                provider = new MBTilesMapProvider(mbTilesString);
                // 3 is the maximum zoom level for working offline
                zoomLevel = 3;
            }
            
            // Create a new UnfoldingMap to be displayed in this window.  
            // The 2nd-5th arguments give the map's x, y, width and height
            // When you create your map we want you to play around with these 
            // arguments to get your second map in the right place.
            // The 6th argument specifies the map provider.  
            // There are several providers built-in.
            // Note if you are working offline you must use the MBTilesMapProvider
            map1 = new UnfoldingMap(this, 50, 50, 350, 500, provider);
            map2 = new UnfoldingMap(this, 450, 450, 350, 500, provider);
    
            // The next line zooms in and centers the map at 
            // 32.9 (latitude) and -117.2 (longitude)
            map1.zoomAndPanTo(zoomLevel, new Location(32.9f, -117.2f));
            map2.zoomAndPanTo(zoomLevel, new Location(32.9f, -117.2f));
            
            // This line makes the map interactive
            MapUtils.createDefaultEventDispatcher(this, map1);
            MapUtils.createDefaultEventDispatcher(this, map2);
            
            // TODO: Add code here that creates map2 
            // Then you'll modify draw() below
    
        }
    
        /** Draw the Applet window.  */
        public void draw() {
            // So far we only draw map1...
            // TODO: Add code so that both maps are displayed
            map1.draw();
            map2.draw();
        }
    
        
    }

最佳答案

我没有给你一个完整的答案,但我想我有一个变通办法,并且可能已经缩小了范围(假设你的问题和我的一样,它肯定是一样的)......我认为它与旧 JOGL 版本的使用有关,我在 JOGL 2.1.5ish 中看到它。据推测,由于存在较新版本的 JOGL,这仍然没有解决。不过,我还不能测试这个理论,希望我能早日有机会做到这一点。
解决方法
据我所知,问题首先出现在 JDK8u252+ 和 JDK11.0.7+ 版本上。如果我使用 JDK8u242 或 JDK11.0.6,那么我就看不到这个问题了。
调查
根据我第一次看到问题的版本,它似乎与 2020 年 1 月至 2020 年 4 月时间范围内的提交有关,可能是此提交:4f1fabd8d08581bc9e0c4b3cc7dffb7f7cc0d5c8OpenJDK project .然而,话虽如此,请带着大量的盐指向这个特定的提交,因为它基本上只是在正确的时间范围内进行的编辑(我认为),它触及了看似相关的代码。我只提到它,以防它可能帮助在该领域有更多知识的人缩小问题的范围。

关于java - Apple AWT 内部异常 : NSWindow drag regions should only be invalidated on the Main Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64331790/

相关文章:

java - 使用 build.sh 脚本构建 Android

java - 迭代变量在for循环外是+1?

ios - Xcode 无法在运行 iOS 13 的真实 iOS 设备上构建

node.js - `npm install` 使用 `gyp: No Xcode or CLT version detected!` 在 node-gyp 重建时失败

java - 通过套接字发送字节(Java Servlet 到 C)

java - ExecutorService:如何检查我的 Callable 是否正在执行?

swift - 如何检测NSWindow是否被拖动?

linux - 命名空间的 docker 问题 - 容器 ID 110090219 无法映射到主机 ID

macos - 在 Swift 中逐行读取文件/URL

swift - 新项目使用 SwiftUI、XCode 12 和 Catalina 失败