Приложение Java 8 некорректно работает в темном режиме на MacOS Catalina 10.15

Если пользователь переключает Системные настройки: Общие: Внешний вид на Темный, главный экран (JFrame) моего приложения переходит с

введите здесь описание изображения

to

введите здесь описание изображения

Так ясно, что Java распознает, что был выбран темный режим, но не очень хорошо его настраивает. Самая важная проблема заключается в том, что цвет текста необходимо изменить с черного на белый, но есть и другие проблемы.

Я использую последнюю версию Java 8 (jdk1.8.0_231.jdk), пока не могу перейти на Java 13, но из примечания к выпуску похоже, что у них все еще есть проблемы с темным режимом.

Есть ли установленный способ исправить это? Я не уверен в лучшем подходе.

Также стоит отметить другие страницы, подкласс JDialog не меняет цвет на черный (кроме строки меню, так что все еще читабельно, но выглядит неуместно)

например идет от

введите здесь описание изображения

to

введите здесь описание изображения

Начал с UIDefaults

public static boolean isDarkModeEnabled()
    {

        try
        {
            // check for exit status only. Once there are more modes than "dark" and "default", we might need to analyze string contents..
            final Process proc = Runtime.getRuntime().exec(new String[]{"defaults", "read", "-g", "AppleInterfaceStyle"});
            proc.waitFor(100, TimeUnit.MILLISECONDS);
            boolean result = proc.exitValue() == 0;
            MainWindow.logger.severe("Is Dark Mode:" + result);
            return result;
        }
        catch (IOException | InterruptedException | IllegalThreadStateException ex)
        {
            // IllegalThreadStateException thrown by proc.exitValue(), if process didn't terminate
            MainWindow.logger.severe("Unable to determine dark mode");
            return false;
        }

public static void displayAsDarkMode()
{
    Color whitish       = new Color(250,250, 250);
    Color fadedWhite    = new Color(200,200, 200);
    Color lightGray     = new Color(49,52, 56);
    Color darkGray      = new Color(30,34,38);

    UIManager.put("Label.foreground", whitish);
    UIManager.put("Panel.background", lightGray);
    UIManager.put("CheckBox.textForeground", whitish);
    UIManager.put("CheckBox.foreground", whitish);
    UIManager.put("TextField.background", darkGray);
    UIManager.put("TextField.foreground", whitish);
    UIManager.put("ComboBox.foreground", darkGray);
    UIManager.put("ComboBox.textForeground", whitish);
    UIManager.put("Button.background", lightGray);
    UIManager.put("Button.textForeground", fadedWhite);
    UIManager.put("List.background", darkGray);
    UIManager.put("List.foreground", whitish);
    UIManager.put("TextArea.background", darkGray);
    UIManager.put("TextArea.inactiveBackground", darkGray);
    UIManager.put("Table.background", darkGray);
    UIManager.put("Table.gridColor", lightGray);
}

но я знаю, что я не первый, кто столкнулся с этой проблемой


person Paul Taylor    schedule 13.11.2019    source источник


Ответы (1)


Похоже, что Sun работает над этим и может подготовить его для Java 14, но в настоящее время не работает должным образом.

https://bugs.openjdk.java.net/browse/JDK-8231438

У меня был некоторый успех, установив цвета UIManager, но проблема осталась такой, как кажется невозможным изменить цвет ComboBox или Button с белого при использовании Aqua L&F

существуют альтернативные пользовательские L & Feels, такие как Darcula и VAqua, но они несут свои проблемы.

Так что я, вероятно, воспользуюсь своим частичным подходом UIManager, пока Oracle должным образом не исправит ситуацию.

person Paul Taylor    schedule 14.11.2019
comment
s / Sun / Oracle /: ^) - person David; 04.06.2020