外观和与感觉无关的颜色键参考

2022-09-04 22:14:27

我目前正在为我所工作的公司的一个产品开发一组自定义控件。为此,我扩展了许多 Swing 控件,并重写了许多方法。paint

为了保持一致的配色方案,我使用.paintsetBackgroundUIManager.getColor

这完全没问题,直到我们注意到Nimbus LookAndFeel(当前JRE版本附带)使用完全不同的颜色键,因此许多东西看起来完全不合适。

例如,虽然所有其他库存LookAndFeels(Metal,Windows Classic,Windows,CDE / Motif,GTK)都将关键“text”定义为文本的明亮背景,并将“textText”定义为相应的前景色,但Nimbus中的“text”实际上是黑色前景色,标准文本背景色似乎不存在。

“TextField.background”可以工作,但例如,对于Windows LookAndFeels来说,这并不存在。

我想你现在已经明白了这个问题。我不想为每个LF维护一组颜色键,谁知道将来会添加什么LF,我的公司可能会决定使用哪些LAM。

当然,一个简单的解决方案是摆脱Nimbus,但可以理解的是,我的老板根本不喜欢这个想法,此外Nimbus现在是JRE的一部分,应该得到支持。

所以我想知道是否有任何标准化的方法可以获得依赖于LAF的颜色,例如“文本背景/前景”,“所选文本bg / fg”等?


答案 1

我不确定是否有“标准化”的方式来获得这些值。

正如你所注意到的,Nimbus使用自己的颜色名称。具体而言,属性和 .textForegroundtextBackground

这种奇怪之处可能是因为Nimbus使用了一小部分基本颜色(在图表中列为“主要”)选择,这些颜色具有从中计算的次要颜色,而这些颜色又被用作所有剩余颜色的基础。


答案 2

是的,正如@josefx暗示的那样,不幸的是,这不是UI的工作方式。它们不是通用可移植属性的池,而是一组实际组件和每个组件的特定实现。它实际上并不是一个对自定义组件友好的可扩展系统。

抽象级别是组件,而不是更细粒度的东西。如果你试图为L&F不知道的组件要求CompentuiUI,那么你就不走运了。ComponentUI只不过是一个绘画方法的包装器,所以它根本没有义务公开任何元数据。

简单地说,你基本上被困在josefx建议的JTextField(或其他一些适当的组件)“颜色刮擦”技术中,或者在代码中添加特定的支持来处理你希望很好地支持的L&F的属性名称的偏心率。

另一个建议是“抢先”L&F的变化,并将您希望支持的L&Fs子类化,以使您的组件在这些L&F中更像一等公民。当 L&F 更改为您支持的 L&F 时,以静默方式将其类名与子类名切换出来,然后为自定义组件实现 ComponentUI,并扩展父 LookAndFeel.createUI 方法,以便它“了解”您的新组件。

这些都不漂亮,但 Swing 组件系统的设计不是在运行时可扩展以处理自定义组件。整个组件套件在创建L&F时一次完成。


推荐