10

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

如果仅将下拉箭头按钮显示为禁用,同时保持框渲染器处于启用状态,那就太好了。

实际:实际组合期望:期望的结果

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

谢谢!

4

5 回答 5

7

这是另一个 hack,由于 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允许我指定一个类似的字符串,这是必要的,因为编辑器忽略了自定义渲染器。如果您使用的是默认渲染器,则无需担心该行;另一方面,如果您使用的是更复杂的渲染器,那么您可能需要完全做其他事情。

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

于 2011-07-22T23:01:19.930 回答
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));
        }

因此,我使用了一个 JLabel 作为渲染器组件,该setForeground方法被覆盖,什么也不做。因此,颜色永远不会改变并保持默认的黑色值。

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

setForeground如果安装的 L&F 或 UI 管理器没有调用该方法,也许测试至少会发出警告。

于 2011-01-28T12:02:51.583 回答
7

这是您的另一种选择:

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

您只需要在实例化之后添加此代码。字母将始终保持黑色。如果禁用或启用,组合框框架将变为灰色或黑色。

它们看起来像这样:

在此处输入图像描述

于 2011-01-28T15:57:04.940 回答
6

尝试这个 **

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

**

于 2012-08-08T10:39:40.600 回答
0

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

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

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

于 2014-04-25T10:37:16.437 回答