0

我为 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"/> 

但是,我希望某些 JLabels(在某些 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 选取锚定到“标签”的样式区域并将其应用于样式表中的所有标签。

以下来自 Synth 的有限 Java 文档的摘录表明,可以混合应用于区域和名称的样式,并且它们的值将被合并:

您可以绑定到单个命名组件,无论它们是否也绑定为区域。例如,假设您希望 GUI 中的“确定”和“取消”按钮与所有其他按钮的处理方式不同。首先,您将使用 component.setName() 方法为 OK 和 Cancel 按钮命名。然后,您将定义三种样式:一种用于一般按钮(region = "Button"),一种用于 OK 按钮(name = "OK"),另一种用于 Cancel 按钮(name = "Cancel")。最后,您将像这样绑定这些样式:

 <bind style="styleButton" type="region" key="Button"> 
 <bind style="styleOK" type="name" key="OK"> 
 <bind style="styleCancel" type="name" key="Cancel">

当一个组件或区域绑定多个样式时,样式会被合并

注意:就像一个样式可以绑定到多个区域或名称一样,多个样式可以绑定到一个区域或名称。这些多个样式合并为区域或名称。文件后面定义的样式优先

但是,似乎第一个样式中定义的 a 不能被第二个样式中定义的覆盖?

4

1 回答 1

0

我可以确认无法覆盖以前使用的锚定类型(也就是说,您不能在区域键上设置 type="BACKGROUND" 颜色,然后在上设置不同的 type="BACKGROUND" 颜色一个命名键。设置不同的类型,例如 TEXT_BACKGROUND 将起作用,因为 Synth 将两种样式合并为一个。因为背景是在第一个样式中设置的,但是,您不能在第二个样式中再次设置它。

非常失望。但是,我找到了一种解决方法。在包罗万象的 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"/>
于 2011-04-08T10:09:55.227 回答