2011-01-28 34 views
9

我有一个JComboBox需要在某个时间点被禁用,但我觉得disabled状态使得它难以阅读,因为它具有较低的对比度。在禁用的JComboBox中提供更好的可读性/对比度JComboBox

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

实际:actual combo期望:desired result

有一种简单的方式实现这一目标或类似的东西?

谢谢!

回答

6

我已经结束了偷看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经理可能做其他事情一样具有半透明层,以显示已禁用项目overpainting而不是改变组件的颜色:-(

也许测试至少可以给予警告,如果安装了大号& F或UI管理器不会调用setForeground方法

6

这里是你有另一种选择:。

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

你只需要实例化后添加以下代码字母将永远留黑色的。组合框框架将变成如果您禁用或启用,则为灰色或黑色。

他们看起来像这样:

enter image description here

+1

不幸的是,这与其他解决方案具有相同的缺点,UI管理器使用涂漆技术来调暗组件的效果仍然不理想。另外,paint方法将被调用的次数比`setForeground`多,所以保持不变并覆盖另一个效果会更有效率。 – fortran 2011-01-31 09:56:37

+1

它看起来不像“想要的”吗? – 2011-01-31 10:05:42

6

下面是另一个黑客,due to Michael Grimes,这不应该由特定的外观受到影响和感觉。诀窍是使组合框可编辑;作为编辑器支持setDisabledTextColor方法的JTextField。而且由于你禁用了组合框,所以它可以编辑并不重要!我使用要做到这一点(从斯卡拉翻译)的代码如下:

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停止返回JTextField(这似乎不太可能)。但到目前为止,这是服务于我的目的。

4

试试这个 **

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

**

0

结果可以用下面的代码来实现:

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

没几个大号& F检验它,但它可能会有所作为,因为这会触发PropertyChange事件(“disabledTextColor”)。请参阅docs