我有一个JComboBox需要在某个时间点被禁用,但我觉得disabled
状态使得它难以阅读,因为它具有较低的对比度。在禁用的JComboBox中提供更好的可读性/对比度JComboBox
如果仅将下拉箭头按钮显示为禁用,并保持框渲染器处于启用状态,那就太好了。
实际:期望:
有一种简单的方式实现这一目标或类似的东西?
谢谢!
我有一个JComboBox需要在某个时间点被禁用,但我觉得disabled
状态使得它难以阅读,因为它具有较低的对比度。在禁用的JComboBox中提供更好的可读性/对比度JComboBox
如果仅将下拉箭头按钮显示为禁用,并保持框渲染器处于启用状态,那就太好了。
实际:期望:
有一种简单的方式实现这一目标或类似的东西?
谢谢!
我已经结束了偷看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
方法
这里是你有另一种选择:。
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setForeground(Color.BLACK);
super.paint(g);
}
});
你只需要实例化后添加以下代码字母将永远留黑色的。组合框框架将变成如果您禁用或启用,则为灰色或黑色。
他们看起来像这样:
下面是另一个黑客,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
(这似乎不太可能)。但到目前为止,这是服务于我的目的。
试试这个 **
UIManager.put("ComboBox.disabledBackground", new Color(212,212,210));
UIManager.put("ComboBox.disabledForeground", Color.BLACK);
**
结果可以用下面的代码来实现:
Component editorComponent = comboBox.getEditor().getEditorComponent();
if(editorComponent instanceof JTextComponent){
((JTextComponent)editorComponent).setDisabledTextColor(Color.black);
}
没几个大号& F检验它,但它可能会有所作为,因为这会触发PropertyChange事件(“disabledTextColor”)。请参阅docs。
不幸的是,这与其他解决方案具有相同的缺点,UI管理器使用涂漆技术来调暗组件的效果仍然不理想。另外,paint方法将被调用的次数比`setForeground`多,所以保持不变并覆盖另一个效果会更有效率。 – fortran 2011-01-31 09:56:37
它看起来不像“想要的”吗? – 2011-01-31 10:05:42