【问题标题】:Windows 10 Style for JInternalFrameJInternalFrame 的 Windows 10 样式
【发布时间】:2018-09-10 09:26:26
【问题描述】:

我正在开发一个使用 Swing 的JInternalFrame 的应用程序。我正在使用UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 的原生外观。

但是,当在 Windows 10 机器上运行时,内部框架的原生外观和感觉仍保持 Windows Vista/7 风格。使用来自this bug report 的示例代码, 我得到以下结果(JDK 8JDK 10):

我认为 Swing 提供的样式已经很长时间没有更新了,因此在比 Vista 更新的系统上,没有打算像原生窗口那样设置内部框架的样式。是否有可能的解决方法?

【问题讨论】:

  • 一种解决方法是可能的,但很复杂。您需要提供自己的InternalFrameUI。这意味着,您需要自己绘制标题栏和边框。然后您需要使用 UIManager.put("InternalFrameUI", MyWindows10UI.class.getName()); 更新内部框架的 UI
  • 我也有同样的问题。我在 Windows Server 12 R2 上尝试过,但渲染仍在 Java 8 上运行。在我使用 Win 10 和 Java 8 的客户端上,我遇到了和你一样的情况:(

标签: java swing jinternalframe


【解决方案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");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-22
    • 2016-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多