有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JDialog在Windows 10上的右监视器上的位置不正确,缩放比例为150%

我有两台显示器(Windows 10)。左监视器(非4K)设置为100%缩放。右监视器(4K)设置为150%缩放。 当我在右侧监视器上运行Java Swing应用程序(OpenJDK 11)(提供了代码)时,JOptionPane弹出窗口没有出现在正确的位置(在JFrame上方居中)。 我的问题是:我做错什么了吗?还有其他人遇到过这个吗。。。他们有解决办法吗

视窗10 两个监视器:左侧无缩放,右侧150%缩放 OpenJDK 11.0.1 Java Swing应用程序

public static final void main(String...strings) {

    StringBuilder sb = new StringBuilder();
    try {
        sb.append("YOU NEED AT LEAST TWO SCREENS TO REPRODUCE THE ISSUE.").append('\n');
        sb.append('\n');
        sb.append("IN WINDOWS DISPLAY SETTINGS :\n");
        sb.append("   1) SET LEFT SCREEN TO 100% scale\n");
        sb.append("   2) SET RIGHT SCREEN TO 150% scale\n");
        sb.append('\n');
        sb.append("Verifying your environment...\n");
        sb.append('\n');

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice[] gdarray = ge.getScreenDevices();
        sb.append("Number of screens detected: ").append(gdarray.length).append('\n');

        for ( int i=0; i<gdarray.length; ++i ) {
            sb.append('\n');
            sb.append("Screen #").append(i+1).append(":\n");
            GraphicsDevice gd = gdarray[i];
            if ( gd instanceof Win32GraphicsDevice ) {
                Win32GraphicsDevice wgd = (Win32GraphicsDevice)gd;
                GraphicsConfiguration gc = wgd.getDefaultConfiguration();
                Rectangle r = gc.getBounds();
                sb.append("    x = ").append(r.x).append("\n");
                sb.append("    y = ").append(r.y).append("\n");
                sb.append("    width = ").append(r.width).append("\n");
                sb.append("    height = ").append(r.height).append("\n");
                sb.append("    scaleX = ").append(wgd.getDefaultScaleX()).append("\n");
                sb.append("    scaleY = ").append(wgd.getDefaultScaleY()).append("\n");
            }
            else {
                sb.append("   Not Windows ?\n");
            }
        }

        sb.append('\n');
        sb.append("Move application to screen 1 and click button below. Popup appears centered over application.\n");
        sb.append('\n');
        sb.append("Move application to screen 2 and click button below. Popup does not appear centered over application.\n");
    }
    catch ( Exception e ) {
        sb.append("An error occurred while trying to verify your environment,\nbut you may still be able to demonstrate the bug");
    }

    JFrame frame = new JFrame();

    JTextPane textPane = new JTextPane();
    textPane.setText(sb.toString());
    JScrollPane scrollPane = new JScrollPane(textPane);

    JButton showPopup = new JButton("Show Popup");
    showPopup.addActionListener((e) -> {
        JOptionPane.showMessageDialog(frame, "This should appear directly over main frame.");
    });

    JPanel buttonPanel = new JPanel();
    buttonPanel.add(showPopup);
    buttonPanel.setBorder(BorderFactory.createEmptyBorder(10,0,0,0));

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(scrollPane, BorderLayout.CENTER);
    panel.add(buttonPanel, BorderLayout.SOUTH);
    panel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10));

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(panel);
    frame.setBounds(0, 0, 500, 650);
    frame.setVisible(true);
}

JOptionPane弹出窗口应位于JFrame的中心。它在左侧显示器上工作,没有缩放。它在正确的显示器上不工作


共 (0) 个答案