Я работаю над приложением, которое использует Swing JInternalFrame
. Я использую собственный внешний вид с UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
.
Однако внешний вид внутреннего фрейма остается в стиле Windows Vista / 7 при работе на компьютере с Windows 10. В примере кода из этот отчет об ошибке,
Я получаю следующий результат (как с JDK 8
, так и с JDK 10
):
Я предполагаю, что стиль, поставляемый со Swing, давно не обновлялся, поэтому нет никакого предполагаемого способа стилизовать внутренний фрейм, как собственное окно, в системах новее, чем Vista. Есть ли вместо этого возможное обходное решение?
У меня точно такая же проблема. Я пробовал на Windows Server 12 R2, и рендеринг все еще работает на Java 8. На моих клиентах с Win 10 и Java 8 я испытал то же самое, что и вы :(
В этой ситуации полезно проверить тему 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");
Обход возможен, но сложен. Вам необходимо предоставить свой собственный
InternalFrameUI
. Это означает, что вам нужно нарисовать строку заголовка и границу самостоятельно. Затем вам нужно обновить пользовательский интерфейс для внутреннего фрейма с помощьюUIManager.put("InternalFrameUI", MyWindows10UI.class.getName());
.