Стиль Windows 10 для JInternalFrame

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

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

JInternalFrame в Windows 10

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


person Appleshell    schedule 10.09.2018    source источник
comment
Обходной путь возможен, но сложен. Вам нужно предоставить свой собственный InternalFrameUI. Это означает, что вам нужно самостоятельно нарисовать строку заголовка и рамку. Затем вам нужно обновить пользовательский интерфейс для внутреннего фрейма, используя UIManager.put("InternalFrameUI", MyWindows10UI.class.getName());   -  person Sergiy Medvynskyy    schedule 10.09.2018
comment
У меня точно такая же проблема. Я попробовал на Windows Server 12 R2, и рендеринг все еще работает на Java 8. На моих клиентах с Win 10 и Java 8 я испытал то же, что и вы :(   -  person Csaba Tenkes    schedule 28.04.2019


Ответы (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");
person Joop Eggen    schedule 10.09.2018