我正在尝试运行 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 月时间范围内的提交有关,可能是此提交:4f1fabd8d08581bc9e0c4b3cc7dffb7f7cc0d5c8
在 OpenJDK project .然而,话虽如此,请带着大量的盐指向这个特定的提交,因为它基本上只是在正确的时间范围内进行的编辑(我认为),它触及了看似相关的代码。我只提到它,以防它可能帮助在该领域有更多知识的人缩小问题的范围。
关于java - Apple AWT 内部异常 : NSWindow drag regions should only be invalidated on the Main Thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64331790/