9

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

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

这可能吗?如果是这样,怎么办?

4

2 回答 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);
            }
        }
    }
}
于 2011-08-19T02:43:02.230 回答
2

我假设您正在谈论 Windows 文件选择器对话框左侧的面板,其中有Desktop,My Computer My Documents图标?

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

于 2011-08-19T02:43:42.187 回答