使用Nimbus外观主题在JFileChooser上设置系统外观布局。

9

JFileChooser上的Windows外观布局比Nimbus等其他外观更好。

因此,我正在寻找一种方法,可以在系统外观的基础上使用Nimbus或其他主题。

这是否可能?如果可能,应该如何实现?


你是在问是否可以仅更改一个组件的外观和感觉吗? - mre
不,我已经知道如何做了。我想要获取一个外观和感觉的布局,并使用另一个主题。 - Daniel Ryan
请注意,Windows PLAF(布局等)在*nix和Mac上不可用(谢天谢地)。 - Andrew Thompson
是的,我知道呵呵。虽然 JFileChooser 系统的外观在 Mac 上比 Windows 更糟糕。不过可以使用 Quaqua 库来解决这个问题。 - Daniel Ryan
2个回答

7
虽然我不知道是否建议这样做,但是这是可能的。通过要求视图在除最顶层的JFileChooser组件之外更新自身(因为这将替换所有选择器组件与你不想要的Nimbus组件),我设法使其工作。
我认为这是一种可能有效的方法,取决于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
+1,有趣的黑客技巧。它似乎也适用于JDK6 Metal LAF。这绝对是一个“买家自负”的解决方案。 - camickr
很棒的东西,确实能够工作。但是颜色并不完美。所以现在也许我只会针对标题栏进行操作。你知道我该如何只针对标题栏进行操作吗? - Daniel Ryan
1
@Zammbi 您可以通过不在每个组件上刷新 UI 而仅刷新特定的组件来针对单个组件进行操作,可能是通过在 refreshUI() 中执行 instanceof 检查 - 构成 Windows JFileChooser UI 的一些组件位于专门的类中。 - prunge
@再次感谢prunge。我稍后会尝试一下,看看能做些什么 :) - Daniel Ryan

2

我猜你在谈论Windows文件选择器对话框左侧的面板,该面板包含桌面我的电脑我的文档图标?

好吧,我怀疑这是无法实现的,因为它是与外观相关的。这是添加到Windows外观中的,因为这就是Windows平台文件选择器的外观。它不支持其他外观。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接