访问外观默认图标?

9

我想要将JCheckbox的选中图标更改为不同的图标,例如JCheckbox的禁用选中图标。如何从UIManager获取禁用选中图标?

我尝试使用UIManager.getIcon("CheckBoxUI.disabledSelectedIcon");。这是错误的图标属性名称还是获取该资源的错误方式?

2个回答

9

显然默认情况下没有这个功能。至少在我尝试调用时没有。

如果键包含CheckBox,则仅从UIManager.getLookAndFeelDefaults().keys()中转储密钥会产生以下结果:

CheckBox.foreground
CheckBox.border
CheckBox.totalInsets
CheckBox.background
CheckBox.disabledText
CheckBox.margin
CheckBox.rollover
CheckBox.font
CheckBox.gradient
CheckBox.focus
CheckBox.icon
CheckBox.focusInputMap

在阅读了akf的答案后,我开始研究plaf.synth包中UIManager代码,并找到了一些调用,这些调用实质上将null disableCheckedIcon委托给外观类来尝试将标准.icon转换为灰色版本。因此,最终我得到了以下内容:

Icon checkedIcon = UIManager.getIcon("CheckBox.icon");
Icon dsiabledCheckedIcon = 
   UIManager.getLookAndFeel().
      getDisabledSelectedIcon(new JCheckBox(), checkedIcon);

3

浏览AbstractButton代码后,看起来disabledSelectedIcon是从selectedIcon派生的,除非在AbstractButton(或在这种情况下为JCheckBox)中通过setDisabledSelectedIcon指定。因此,调用UIManager.getIcon("...")将不会返回您要查找的对象。

编辑:

请注意,JCheckBox具有如JButton一样定义的icon字段,它是显示在文本旁边的图像,与您可能正在引用的“已选中”或“未选中”框图标分开。

勾选/取消勾选图标由单个类处理,可以在UIManager.getObject('CheckBox.icon')中找到。它是Icon的子类,并处理其已选和未选状态的绘制。您可以在各种[L&F name]IconFactory类中看到它的示例。


1
只是询问 selectedIcon、CheckBox.selectedIcon 或 CheckBoxUI.selectedIcon,它们都返回 null。 - Jay R.
你的回答激发了我深入研究Synth包,找出标准图标是如何转换的。谢谢。 - Jay R.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接