В эксклюзивном полноэкранном режиме Java поддерживается «неправильный режим отображения» - PullRequest
1 голос
/ 26 октября 2019

Я не могу на всю жизнь понять Exlusive Fullscreen. Он продолжает выдавать «Недопустимый режим отображения», независимо от того, какой из моих режимов отображения я пробую.

Я пытался сделать это, как показывают официальные учебные пособия по Java, а также учебные пособия других людей. Я продолжаю получать одну и ту же ошибку. Try-finally, как предлагается в официальных руководствах по Java, дает мне те же проблемы. Я уже убедился, что использую свои поддерживаемые режимы.

Может ли это быть как-то связано с разгоном дисплея моего ноутбука от 75 Гц до 100 Гц? Я, конечно, попытался предоставить свой собственный DisplayMode с DisplayMode.REFRESH_RATE_UNKNOWN.

import java.awt.DisplayMode;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.JFrame;

public class Main {

    private static GraphicsEnvironment gfxEnv;
    private static GraphicsDevice gfxDevice;
    private static DisplayMode defaultDisplayMode;

    public static void main(String[] args) {
        init();
    }

    private static void init() {
        gfxEnv = GraphicsEnvironment.getLocalGraphicsEnvironment();
        gfxDevice = gfxEnv.getDefaultScreenDevice();
        defaultDisplayMode = gfxDevice.getDisplayMode();

        DisplayMode[] displayModes = gfxDevice.getDisplayModes();
        DisplayMode dm1920x1080x75 = displayModes[displayModes.length - 1];
        System.out.println(dm1920x1080x75);

        JFrame window = new JFrame();
        window.addKeyListener(new KeyAdapter() {

            @Override
            public void keyTyped(KeyEvent e) {
                aMethodIWantToCallElseWhere();
            }

        });
        window.setUndecorated(true);
        window.setResizable(false);
        if (gfxDevice.isFullScreenSupported()) {
            gfxDevice.setFullScreenWindow(window);
            if (gfxDevice.isDisplayChangeSupported())
                gfxDevice.setDisplayMode(dm1920x1080x75);
        }
    }

    public static void aMethodIWantToCallElseWhere() {
        if (gfxDevice.isDisplayChangeSupported())
            gfxDevice.setDisplayMode(defaultDisplayMode);
        gfxDevice.setFullScreenWindow(null);
    }

}

Вывод на консоль:

1920x1080x32bpp@75Hz

Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid display mode
    at java.desktop/sun.awt.Win32GraphicsDevice.setDisplayMode(Win32GraphicsDevice.java:452)
    at Main.aMethodIWantToCallElseWhere(Main.java:48)
    at Main$1.keyTyped(Main.java:33)
    at...

Это действительно выводит на полный экран без каких-либо проблем. Но выход из него - вот где возникает проблема. Я попытался сделать это предложенным способом try-finally, который выдает ту же самую ошибку - «Недопустимый режим отображения».

Я поиграл с кучей разных идей, но сейчас у меня нетиз них. Я что-то упустил?

Я бы хотел избежать попытки-наконец, просто чтобы я мог менять режимы по запросу пользователя. Я надеюсь, что это возможно.

РЕДАКТИРОВАТЬ Итак, я попытался установить обратно дисплей с 100 Гц до 75 Гц. Это решило это. Как мне запустить его с разогнанным дисплеем, который даже не отображается в getDisplayModes?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...