Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AWT GraphicsConfig在使用具有不同比例设置的多个显示器时存在坐标问题_Java_Swing_Javafx_Awt - Fatal编程技术网

Java AWT GraphicsConfig在使用具有不同比例设置的多个显示器时存在坐标问题

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

我正在使用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]

/*
 * 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