【问题标题】:System look and feel layout on JFileChooser but with nimbus look and feel themeJFileChooser 上的系统外观布局,但带有 nimbus 外观主题
【发布时间】:2011-10-30 06:44:08
【问题描述】:

JFileChooser 上的窗口外观布局比其他外观和感觉更像 nimbus。

所以我正在寻找一种方法来使系统的布局具有外观和感觉,但在顶部有 nimbus 或其他主题。

这可能吗?如果可以怎么办?

【问题讨论】:

  • 您是在问是否可以仅更改一个组件的外观和感觉?
  • 不,我已经知道该怎么做了。我想获得一种外观的布局并使用另一种的主题。
  • 请注意,Windows PLAF(布局等)在 *nix 和 Mac 上不可用。 (谢天谢地)。
  • 是的,我知道,呵呵。尽管 Mac 上的 JFileChooser 系统外观布局比 Windows 差。虽然可以使用 Quaqua 库来解决这个问题。

标签: java swing look-and-feel jfilechooser nimbus


【解决方案1】:

这是可能的,虽然我不知道是否推荐。我设法通过要求视图在除最顶层 JFileChooser 组件之外的所有组件上更新自身来使其工作(因为这会将所有选择器组件替换为您不想要的 Nimbus 组件)。

我认为这是一种 hack,可能会或可能不会起作用,具体取决于 Windows 外观和感觉的内部结构。它几乎依赖于由 Swing 组件构建的整个 JFileChooser。如果它被更改为使用更直接的本机渲染(即 Java 要求 Windows 绘制选择器的重要部分),它将无法工作。不知道该技巧与其他组件的效果如何。

无论如何,这段代码似乎适用于 JDK 7:

package test;

import java.awt.Component;

import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.UIManager;
import javax.swing.plaf.nimbus.NimbusLookAndFeel; //Or use com.sun.... if you are using JDK < 7

public class LAFTester
{
    public static void main(String... args)
    throws Exception
    {
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        JFileChooser chooser = new JFileChooser();
        chooser.updateUI(); //Create UI objects
        UIManager.setLookAndFeel(NimbusLookAndFeel.class.getName()); //Now set look and feel
        //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); //works with metal as well
        refreshUI(chooser, false);

        chooser.showOpenDialog(null);
    }

    private static void refreshUI(JComponent c, boolean includeParent)
    {
        if (includeParent)
            c.updateUI();

        for (int i = 0; i < c.getComponentCount(); i++)
        {
            Component child = c.getComponent(i);
            if (child instanceof JComponent)
            {
                refreshUI((JComponent)child, true);
            }
        }
    }
}

【讨论】:

  • +1,有趣的 hack。它似乎也适用于 JDK6 Metal LAF。绝对是买家提防解决方案。
  • 确实有用的东西。不过上色并不完美。所以也许我现在只针对标题栏。你知道我如何只定位标题栏吗?
  • @Zammbi 您可以通过不刷新每个组件上的 UI 而仅刷新特定组件来潜在地针对单个组件,可能通过在 refreshUI() 中进行 instanceof 检查 - 一些组件构成Windows JFileChooser UI 属于专门的类。
  • @再次感谢 prunge。我稍后会玩这个,看看我能做什么:)
【解决方案2】:

我假设您说的是 Windows 文件选择器对话框左侧的面板,其中包含 DesktopMy ComputerMy Documents 图标?

好吧,我怀疑这是否可行,因为这是 LAF 特有的。这被添加到 Windows LAF 中,因为这就是 Windows 平台文件选择的样子。其他 LAF 不支持。

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多