Swing Synth Skin:你可以覆盖样式吗?

时间:2011-04-07 16:20:49

标签: java swing synth

我为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文档的摘录表明,可以混合应用于区域和名称的样式,并且它们的值将合并:

  

您可以绑定到个人,命名   组件,无论它们是否是   也被绑定为区域。例如,   假设你想要“OK”和   处理GUI中的“取消”按钮   与其他所有人不同   纽扣。首先,你会好的   和取消按钮名称,使用   component.setName()方法。那么你   将定义三种风格:一种用于   按钮一般(region =   “按钮”),一个用于OK按钮(名称   =“OK”),一个用于取消按钮(名称=“取消”)。最后,你会的   绑定这些样式:

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

绑定组件或区域时   风格不止一种   合并

     

注意:就像一个样式可以绑定   多个地区或名称,多个   样式可以绑定到某个区域或   名称。这些多种样式已合并   对于该地区或名称。优先权是   给予后面定义的样式   文件

但是,第一种Style中定义的内容似乎不会被第二种样式中的定义覆盖?

1 个答案:

答案 0 :(得分:0)

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

非常令人失望。不过,我找到了一个解决方法。在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"/>