我为JLabel定义了一个样式:
<style id="myLabel">
<state>
<opaque value="true"/>
<color value="blue" type="BACKGROUND"/>
<color value="red" type="FOREGROUND"/>
</state>
</style>
<bind style="myLabel" type="region" key="label"/>
但是,我希望某些jlabel(在某些jpanel中)的样式完全不同:
<style id="myUnrelatedPanel">
<state>
<opaque value="true"/>
<color value="green" type="BACKGROUND"/>
<color value="yellow" type="FOREGROUND"/>
</state>
</style>
<bind style="myLabel" type="name" key="_valueOfMyPanel.getName()_in_here"/>
上面的不起作用,因为JLabel的样式是强制的。
嵌套样式似乎不起作用。编译器不会报错;Synth选取锚定到'label'的样式区域,并将其应用于样式表中的所有标签。
以下摘自Synth上有限的Java文档的摘录表明,可以将应用于区域和名称的样式混合在一起,并且它们的值将被合并:
你可以绑定到individual, named组件,不管它们是不是也被绑定为区域。例如,假设您想要有"OK"one_answers"取消"按钮在您的GUI处理和其他的都不一样按钮。首先,你会同意和Cancel按钮名称,使用component.setName()方法。然后,你将定义三个样式:一个为按钮一般(区域="Button"),一个用于OK按钮(name= "OK"),一个用于取消按钮(name = "Cancel")。最后,你会像这样绑定这些样式:
<bind style="styleButton" type="region" key="Button">
<bind style="styleOK" type="name" key="OK">
<bind style="styleCancel" type="name" key="Cancel">
当组件或区域绑定到不止一种风格,风格是合并后的
注意:就像样式可以绑定到多个区域或名称,多个样式可以绑定到区域或名字这些多个样式被合并用于区域或名称。优先级是类中稍后定义的样式文件
但是,在第一个样式中定义的样式似乎不能被第二个样式中定义的样式覆盖。
我可以确认不可能覆盖以前使用的锚定类型(也就是说,您不能在区域键上设置type="BACKGROUND"颜色,然后在命名键上设置不同的type="BACKGROUND"颜色)。当Synth将两种样式合并为一时,可以设置不同的类型,例如TEXT_BACKGROUND。因为BACKGROUND是在第一种样式中设置的,但是,你不能在第二种样式中再次设置它。
非常令人失望。不过,我找到了一个变通办法。在catch-all中设置一组"默认"颜色,key="。*"样式,并在名称锚定样式中偏离这些颜色:
<style id="backingStyle">
<state>
<opaque value="false"/>
<font name="Arial" size="12"/>
<color value="black" type="BACKGROUND"/>
<color value="white" type="FOREGROUND"/>
</state>
</style>
<bind style="backingStyle" type="region" key=".*"/>
和
<style id="backingStyle">
<state>
<opaque value="false"/>
<font name="Verdana" size="12"/>
<color value="blue" type="BACKGROUND"/>
<color value="green" type="FOREGROUND"/>
</state>
</style>
<bind style="backingStyle" type="name" key="nameOfMyPanel"/>