UIManager颜色在JFileChooser中的应用

3
我使用Nimbus外观并进行了3处颜色更改:
UIManager.put("nimbusSelection", new Color(164,164,164));
UIManager.put("nimbusSelectionBackground", new Color(214,217,223));
UIManager.put("nimbusSelectedText", Color.BLACK);

我的文件选择器看起来像这样:

enter image description here

所选文件的名称以白色显示,看起来不好看,同时在组合框中选择的文件类型也是如此。我想将它们改为黑色,但nimbusSelectedText已经是黑色并且无法工作。

我还查看了Nimbus默认设置指南http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/_nimbusDefaults.html#primary,但我没有找到可以解决此问题的FileChooser或Combobox参数。

请帮忙确定必要的参数吗?谢谢。


第二个提示:http://tips4java.wordpress.com/2008/10/09/uimanager-defaults/,但我认为需要JDK1.6.020或更高版本。 - mKorbel
3个回答

2

JFileChooser是复合型的JComponent,你可以提取JButtonsJToggleButtons和包含JList的JViewPort中的JScrollPane。请下载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);
    }
} 

1

我真的不知道,但你尝试设置这些属性了吗:

List.selectionForceground
List.selectionBackground

文件选择器看起来很像一个列表...


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

controlHighlight
controlLHighlight

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);

你的“Modify”是什么意思? - Martijn Courteaux
2
@Martijn,比如说改变背景颜色? - Eng.Fouad
嗯...... 是的,可能吧。确实是个蠢问题 :P - Martijn Courteaux
运行得很好……与 JList 一起。我的问题出在 JComboBox 上,它没有 getSelectionBackground 方法 :( - Roman Rdgz

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