Java AWT GraphicsConfig在使用具有不同比例设置的多个显示器时存在坐标问题
我正在使用JavaFx开发一个应用程序,并用SwingNode嵌入了一些JavaAWT/Swing组件。最近我注意到一些奇怪的行为,当使用多显示器设置时,每个显示器的缩放比例不同。新打开的弹出窗口(即上下文菜单和组合框内容弹出窗口)放错位置 主屏幕定义坐标系,左侧的另一个显示获取负坐标。(见下图) 显示器1的左上角坐标应与显示器2的右上角坐标相同。但事实并非如此 AWT为[-1536771]对[-1920964],javafx为[-1920443]对[-1920443] 我们跟踪到awt-Win32GraphicsConfig getBounds方法。据我所知,屏幕1(左显示)的缩放是在x/y的绝对值上完成的。这导致假设下一个屏幕使用相同的缩放 左上角x值:-3840(平台x)/1.25(比例因子)=-3072 有了这个x值和1536的宽度,我们最终进入显示2的坐标系[-1920到0]Java AWT GraphicsConfig在使用具有不同比例设置的多个显示器时存在坐标问题,java,swing,javafx,awt,Java,Swing,Javafx,Awt,我正在使用JavaFx开发一个应用程序,并用SwingNode嵌入了一些JavaAWT/Swing组件。最近我注意到一些奇怪的行为,当使用多显示器设置时,每个显示器的缩放比例不同。新打开的弹出窗口(即上下文菜单和组合框内容弹出窗口)放错位置 主屏幕定义坐标系,左侧的另一个显示获取负坐标。(见下图) 显示器1的左上角坐标应与显示器2的右上角坐标相同。但事实并非如此 AWT为[-1536771]对[-1920964],javafx为[-1920443]对[-1920443] 我们跟踪到awt-Wi
/*
* Class: sun_awt_Win32GraphicsConfig
* Method: getBounds
* Signature: ()Ljava/awt/Rectangle
*/
JNIEXPORT jobject JNICALL
Java_sun_awt_Win32GraphicsConfig_getBounds(JNIEnv *env, jobject thisobj,
jint screen)
{
jclass clazz;
jmethodID mid;
jobject bounds = NULL;
clazz = env->FindClass("java/awt/Rectangle");
CHECK_NULL_RETURN(clazz, NULL);
mid = env->GetMethodID(clazz, "<init>", "(IIII)V");
if (mid != 0) {
RECT rRW = {0, 0, 0, 0};
Devices::InstanceAccess devices;
AwtWin32GraphicsDevice *device = devices->GetDevice(screen);
if (TRUE == MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(screen), &rRW)) {
int x = (device == NULL) ? rRW.left : device->ScaleDownX(rRW.left);
int y = (device == NULL) ? rRW.top : device->ScaleDownY(rRW.top);
int w = (device == NULL) ? rRW.right - rRW.left
: device->ScaleDownX(rRW.right - rRW.left);
int h = (device == NULL) ? rRW.bottom - rRW.top
: device->ScaleDownY(rRW.bottom - rRW.top);
bounds = env->NewObject(clazz, mid, x, y, w, h);
}
else {
// 4910760 - don't return a null bounds, return the bounds of the
// primary screen
int w = ::GetSystemMetrics(SM_CXSCREEN);
int h = ::GetSystemMetrics(SM_CYSCREEN);
bounds = env->NewObject(clazz, mid,
0, 0,
device == NULL ? w : device->ScaleDownX(w),
device == NULL ? h : device->ScaleDownY(h));
}
if (safe_ExceptionOccurred(env)) {
return 0;
}
}
return bounds;
}
/*
*类别:sun\u awt\u Win32GraphicsConfig
*方法:getBounds
*签名:()Ljava/awt/Rectangle
*/
JNIEXPORT作业对象JNICALL
Java_sun_awt_Win32 GraphicsConfig_getBounds(JNIEnv*env,jobject thisobj,
金氏筛)
{
jclass-clazz;
jmethodidemid;
jobject界限=空;
clazz=env->FindClass(“java/awt/Rectangle”);
检查返回值(clazz,NULL);
mid=env->GetMethodID(clazz,”,“(ii)V”);
如果(中间!=0){
RECT rRW={0,0,0,0};
设备::InstanceAccess设备;
AwtWin32GraphicsDevice*设备=设备->获取设备(屏幕);
if(TRUE==MonitorBounds(AwtWin32GraphicsDevice::GetMonitor(屏幕),&rRW)){
int x=(device==NULL)?rRW.left:设备->ScaleDownX(rRW.left);
int y=(device==NULL)?rRW.top:device->ScaleDownY(rRW.top);
int w=(设备==NULL)?rRW.right-rRW.left
:device->ScaleDownX(rRW.right-rRW.left);
int h=(设备==NULL)?rRW.bottom-rRW.top
:设备->缩放向下(rRW.bottom-rRW.top);
边界=env->NewObject(clazz、mid、x、y、w、h);
}
否则{
//4910760-不要返回空边界,返回
//主屏幕
int w=::GetSystemMetrics(SM_CXSCREEN);
inth=::GetSystemMetrics(SM_CYSCREEN);
bounds=env->NewObject(clazz,mid,
0, 0,
设备==NULL?w:device->ScaleDownX(w),
设备==NULL?h:设备->缩放向下(h));
}
如果(发生安全例外(环境)){
返回0;
}
}
返回边界;
}
解决这个问题有什么想法吗?哪个java/fx版本?隐约记得hidpi监视器出现了一些问题,我认为这些问题已经得到了修复(尽管不确定;)openjdk 11//openjfx 13