我有一个需要在某些时候被禁用的JComboBox,但我觉得disabled
状态使得它更难阅读,因为它具有低对比度。
如果仅将下拉箭头按钮显示为已禁用,同时将框渲染器保持为已启用状态,那将会很不错。
实际:所需:
有没有简单的方法来实现这个或类似的东西?
谢谢!
答案 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);
}
});
您只需在实例化后添加此代码即可。这些字母总是保持黑色。如果禁用或启用,组合框框将变为灰色或黑色。
他们看起来像这样:
答案 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。