我有一个 JComboBox 需要在某些时候被禁用,但我觉得它的disabled
状态使它很难阅读,因为它的对比度很低。
如果仅将下拉箭头按钮显示为禁用,同时保持框渲染器处于启用状态,那就太好了。
实际:期望:
有没有一种简单的方法来实现这个或类似的东西?
谢谢!
我有一个 JComboBox 需要在某些时候被禁用,但我觉得它的disabled
状态使它很难阅读,因为它的对比度很低。
如果仅将下拉箭头按钮显示为禁用,同时保持框渲染器处于启用状态,那就太好了。
实际:期望:
有没有一种简单的方法来实现这个或类似的东西?
谢谢!
这是另一个 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
(这似乎不太可能)。但到目前为止,它服务于我的目的。
我最终偷看了 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 管理器没有调用该方法,也许测试至少会发出警告。
这是您的另一种选择:
jComboBox1.setRenderer(new DefaultListCellRenderer() {
@Override
public void paint(Graphics g) {
setForeground(Color.BLACK);
super.paint(g);
}
});
您只需要在实例化之后添加此代码。字母将始终保持黑色。如果禁用或启用,组合框框架将变为灰色或黑色。
它们看起来像这样:
尝试这个 **
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);
}
我没有用几个 L&F 测试它,但它可能会有所不同,因为这会触发 PropertyChange 事件(“disabledTextColor”)。请参阅 文档。