禁用的JComboBox中更好的可读性/对比度

时间:2011-01-28 11:20:58

标签: java swing visibility jcombobox disabled-control

我有一个需要在某些时候被禁用的JComboBox,但我觉得disabled状态使得它更难阅读,因为它具有低对比度。

如果仅将下拉箭头按钮显示为已禁用,同时将框渲染器保持为已启用状态,那将会很不错。

实际:actual combo所需:desired result

有没有简单的方法来实现这个或类似的东西?

谢谢!

5 个答案:

答案 0 :(得分:7)

我最终偷看了BasicComboBoxUI,我发现了这个:

        if ( comboBox.isEnabled() ) {
            c.setForeground(comboBox.getForeground());
            c.setBackground(comboBox.getBackground());
        }
        else {
            c.setForeground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledForeground", null));
            c.setBackground(DefaultLookup.getColor(
                     comboBox, this, "ComboBox.disabledBackground", null));
        }

所以我用jadabel作为渲染器组件,setForeground方法覆盖了什么都不做。因此,颜色永远不会改变,并保持默认的黑色值。

问题是这个技巧是特定于实现的。给定的外观和感觉或UI管理器可能会执行其他操作,例如使用半透明图层重绘以显示禁用的项目,而不是更改组件的颜色: - (

如果已安装的L& F或UI管理器未调用setForeground方法,则测试可能至少会发出警告。

答案 1 :(得分:6)

这是您的另一个选择:

    jComboBox1.setRenderer(new DefaultListCellRenderer() {
        @Override
        public void paint(Graphics g) {
            setForeground(Color.BLACK);
            super.paint(g);
        }
    });

您只需在实例化后添加此代码即可。这些字母总是保持黑色。如果禁用或启用,组合框框将变为灰色或黑色。

他们看起来像这样:

enter image description here

答案 2 :(得分:6)

这是另一个黑客,due to Michael Grimes,不应受特定外观和感觉的影响。诀窍是使组合框可编辑;在编辑器支持JTextField方法时公开的setDisabledTextColor。由于您正在禁用组合框,因此它是可编辑的并不重要!我用来执行此操作的代码(从Scala翻译)如下:

JComboBox cb = ...;
...
cb.setEditable(true);
ComboBoxEditor editor = cb.getEditor()
JTextField     etf    = (JTextField)etf.getEditorComponent()
etf.setDisabledTextColor(UIManager.getColor("ComboBox.foreground"));
etf.setBackground(UIManager.getColor("ComboBox.background"));
// editor.setItem(format(obj));
cb.setEnabled(false);

演员阵容保证在这里取得成功,因为我们使用的是BasicComboBoxEditor,其文档说“编辑器是作为JTextField实现的”。出现注释掉的行是因为我使用的是自定义渲染器,它会打印出带有额外文本的整数;调用setItem允许我指定一个类似的字符串,这是必要的,因为编辑器会忽略自定义渲染器。如果您使用默认渲染器,则无需担心该行;另一方面,如果你使用的是更复杂的渲染器,那么你可能需要完全做其他事情。

尽管这是一个可怕的kludge,它工作,它似乎并不依赖于任何实现定义的功能。我可以想象这两个地方的突破是(a),如果一个可编辑的组合框看起来与一个不可编辑的组合框非常不同(例如,我的第一次尝试没有改变文本字段的背景颜色,这使它看起来不对劲) ,或(b)如果BasicComboBoxEditor停止返回JTextField(这似乎不太可能)。但到目前为止,它符合我的目的。

答案 3 :(得分:4)

试试这个 **

UIManager.put( "ComboBox.disabledBackground", new Color(212,212,210) );
UIManager.put( "ComboBox.disabledForeground", Color.BLACK );

**

答案 4 :(得分:0)

使用以下代码可以实现结果:

    Component editorComponent = comboBox.getEditor().getEditorComponent();
    if(editorComponent instanceof JTextComponent){
        ((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
    }

我没有用几个L& F测试它,但它可能会有所不同,因为这会激发一个PropertyChange事件(“disabledTextColor”)。请参阅docs