3

我正在使用 Nimbus 外观和感觉,它的颜色只有 3 处变化:

UIManager.put("nimbusSelection", new Color(164,164,164));
UIManager.put("nimbusSelectionBackground", new Color(214,217,223));
UIManager.put("nimbusSelectedText", Color.BLACK);

我的 FileChooser 看起来像这样:

在此处输入图像描述

因此所选文件的名称显示为白色并且看起来很糟糕,并且在组合框中选择的文件类型也会发生这种情况。我想将其更改为黑色,但 nimbusSelectedText 已经是黑色并且无法正常工作。

我还查看了http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html#primary上的 Nimbus Defaults 指南,我在 FileChooser 或 Combobox 上没有看到任何参数来解决这个问题。

任何帮助确定必要的参数?谢谢

4

3 回答 3

2

JFileChooser是复合JComponentJButtons,你可以提取JScrollPaneJToggleButtonsJViewPort 包含 JList,请下载 Darryl 的Swing Utils,阅读描述,然后运行(Darryl 的)代码,结果是选择 JList 或 JTable (我投票赞成)

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.*;
import javax.swing.plaf.metal.MetalButtonUI;

public class CrazyFileChooser {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new CrazyFileChooser().makeUI();
            }
        });
    }

    public void makeUI() {
        JFileChooser chooser = new JFileChooser();
        for (AbstractButton button : SwingUtils.getDescendantsOfType(AbstractButton.class, chooser)) {
            button.setUI(new XORButtonUI());
        }
        for (JList list : SwingUtils.getDescendantsOfType(JList.class, chooser)) {
            list.setBackground(Color.PINK);
        }
        chooser.showOpenDialog(null);
    }
}

class XORButtonUI extends MetalButtonUI {

    @Override
    public void paint(Graphics g, JComponent c) {
        g.setXORMode(Color.YELLOW);
        super.paint(g, c);
    }
} 
于 2011-07-20T08:20:26.800 回答
1

我真的不知道,但是您是否尝试过设置此属性:

List.selectionForceground
List.selectionBackground

FileChooser 看起来很像一个列表......


第二次尝试。也许这些设置有帮助:

controlHighlight
controlLHighlight
于 2011-07-20T08:13:50.960 回答
1

好吧,有一种方法可以做到这一点。您可以从 JFileChooser 获取 JList 并对其进行修改:

public boolean getJList(Container c)
{
    Component[] cmps = c.getComponents();
    for (Component cmp : cmps)
    {
        if (cmp instanceof JList)
        {
            modifyJList((JList)cmp);
            return true;
        }
        if (cmp instanceof Container)
        {
            if(getJList((Container) cmp)) return true;
        }
    }
    return false;
}
private void modifyJList(JList list)
{
    // Here you can modify your JList
}

并使用它,只需调用getJList()

JFileChooser chooser = new JFileChooser();
getJList(chooser);
于 2011-07-20T08:16:05.733 回答