Module java.desktop

Package javax.swing.plaf.synth


package javax.swing.plaf.synth
Synth是一种可皮肤化的外观,其中所有绘制都是委托的。Synth不提供默认外观。为了使用Synth,您需要指定一个文件,或者提供一个SynthStyleFactory。这两种配置选项都需要理解下面描述的synth架构,以及对Swing架构的理解。

除非另有说明,否则在synth包中定义的所有方法中,null都不是合法值,如果传入null将导致NullPointerException

Synth

Synth中的每个ComponentUI实现都与一个SynthStyle关联,每个Region大多数Components只有一个Region,因此只有一个SynthStyleSynthStyle用于访问所有与样式相关的属性:字体、颜色和其他Component属性。此外,SynthStyle还用于获取用于绘制背景、边框、焦点和Component的其他部分的SynthPainterComponentUISynthStyleFactory获取SynthStyle。可以通过直接提供SynthStyleFactory(通过SynthLookAndFeel.setStyleFactory(javax.swing.plaf.synth.SynthStyleFactory))或间接提供(通过SynthLookAndFeel.load(java.io.InputStream, java.lang.Class<?>))来提供SynthStyleFactory。以下示例使用SynthLookAndFeel.load()方法配置SynthLookAndFeel并将其设置为当前外观:

     SynthLookAndFeel laf = new SynthLookAndFeel();
     laf.load(MyClass.class.getResourceAsStream("laf.xml"), MyClass.class);
     UIManager.setLookAndFeel(laf);
 

许多JComponent被分解为更小的部分,并由Region中的类型安全枚举进行标识。例如,JTabbedPaneJTabbedPaneRegionRegion.TABBED_PANE)、内容区域(Region.TABBED_PANE_CONTENT)、标签后面的区域(Region.TABBED_PANE_TAB_AREA)和标签(Region.TABBED_PANE_TAB)的Region组成。每个JComponent的每个Region都将有一个SynthStyle。这允许您自定义每个JComponent的每个区域的各个部分。

许多Synth方法都接受一个SynthContext。这用于提供有关当前Component的信息,包括:与当前Region关联的SynthStyleComponent的状态作为位掩码(请参阅SynthConstants以获取有效状态),以及标识正在绘制的Component部分的Region

所有非JTextComponent的文本渲染都委托给一个SynthGraphicsUtils,该对象是使用SynthStyle方法SynthStyle.getGraphicsUtils(javax.swing.plaf.synth.SynthContext)获取的。您可以通过提供自己的SynthGraphicsUtils来自定义文本渲染。

特定组件的注意事项

JTree

Synth为树的单元格提供了一个区域:Region.TREE_CELL。要指定渲染器的颜色,您需要为TREE_CELL区域提供一个样式。以下是示例:

   <style id="treeCellStyle">
     <opaque value="TRUE"/>
     <state>
       <color value="WHITE" type="TEXT_FOREGROUND"/>
       <color value="RED" type="TEXT_BACKGROUND"/>
     </state>
     <state value="SELECTED">
       <color value="RED" type="TEXT_FOREGROUND"/>
       <color value="WHITE" type="BACKGROUND"/>
     </state>
   </style>
   <bind style="treeCellStyle" type="region" key="TreeCell"/>
 

这指定了选定时的红色白色组合,未选定时的白色红色组合。要查看背景,您需要指定标签不是不透明的。以下XML片段执行此操作:


   <style id="labelStyle">
     <opaque value="FALSE"/>
   </style>
   <bind style="labelStyle" type="region" key="Label"/>
 

JList和JTable

JList和JTable的渲染器使用的颜色是通过列表和表格区域指定的。以下XML片段说明了如何指定选定时的红色白色组合,未选定时的白色红色组合:

   <style id="style">
     <opaque value="TRUE"/>
     <state>
       <color value="WHITE" type="TEXT_FOREGROUND"/>
       <color value="RED" type="TEXT_BACKGROUND"/>
       <color value="RED" type="BACKGROUND"/>
     </state>
     <state value="SELECTED">
       <color value="RED" type="TEXT_FOREGROUND"/>
       <color value="WHITE" type="TEXT_BACKGROUND"/>
     </state>
   </style>
   <bind style="style" type="region" key="Table"/>
   <bind style="style" type="region" key="List"/>