Стиль Windows 10 для JInternalFrame

Я работаю над приложением, которое использует Swing JInternalFrame. Я использую собственный внешний вид с UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());.

Однако внешний вид внутреннего фрейма остается в стиле Windows Vista / 7 при работе на компьютере с Windows 10. В примере кода из этот отчет об ошибке, Я получаю следующий результат (как с JDK 8, так и с JDK 10):

Стиль Windows 10 для JInternalFrame

Я предполагаю, что стиль, поставляемый со Swing, давно не обновлялся, поэтому нет никакого предполагаемого способа стилизовать внутренний фрейм, как собственное окно, в системах новее, чем Vista. Есть ли вместо этого возможное обходное решение?

Обход возможен, но сложен. Вам необходимо предоставить свой собственный InternalFrameUI. Это означает, что вам нужно нарисовать строку заголовка и границу самостоятельно. Затем вам нужно обновить пользовательский интерфейс для внутреннего фрейма с помощью UIManager.put("InternalFrameUI", MyWindows10UI.class.getName());.

Sergiy Medvynskyy 10.09.2018 12:12

У меня точно такая же проблема. Я пробовал на Windows Server 12 R2, и рендеринг все еще работает на Java 8. На моих клиентах с Win 10 и Java 8 я испытал то же самое, что и вы :(

Csaba Tenkes 28.04.2019 14:29
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
648
1

Ответы 1

В этой ситуации полезно проверить тему UIManager:

    JFrame.setDefaultLookAndFeelDecorated(true);
    Object[] keys = UIManager.getLookAndFeel().getDefaults().keySet().toArray();
    Arrays.sort(keys, Comparator.comparing(Object::toString));
    for (int i = 0; i < keys.length; i++) {
        if (keys[i].toString().startsWith("InternalFrame.")) {
            System.out.println(keys[i] + " : " + javax.swing.UIManager.getDefaults().get(keys[i]));
        }
    }

Вы найдете следующие ключи:

    "InternalFrame.closeIcon"
    "InternalFrame.iconifyIcon"
    "InternalFrame.maximizeIcon"
    "InternalFrame.minimizeIcon"

Затем создайте 4 прозрачных значка .png для закрытия, уменьшения, увеличения / уменьшения.

private void setInternalFrameIcon(String uiKey, String resource) {
    ImageIcon icon = new ImageIcon(getClass().getResource(resource));
    UIManager.put(uiKey, close);
}

    setInternalFrameIcon("InternalFrame.closeIcon", "... .png");
    setInternalFrameIcon("InternalFrame.iconifyIcon", "... .png");
    setInternalFrameIcon("InternalFrame.maximizeIcon", "... .png");
    setInternalFrameIcon("InternalFrame.minimizeIcon", "... .png");

Другие вопросы по теме