【问题标题】:Java-LAF: How to create Decoration using Synth-XML?Java-LAF:如何使用 Synth-XML 创建装饰?
【发布时间】:2013-05-08 09:07:01
【问题描述】:

我正在尝试使用 Synth-Framework 创建自定义外观。

我成功使用了一个教程(Look-And-Feel Tutorial by Oracle/Sun ) 进行实验,并设法为按钮、面板等设置皮肤。

我现在的问题是,我想装饰 Window/JFrame。

我阅读了一些关于它的内容,并使用 MetalLookAndFeel 和此代码进行了尝试,效果很好:

    try{
        UIManager.setLookAndFeel(new MetalLookAndFeel());
    }catch(UnsupportedLookAndFeelException e){

    }
    javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
    new SFframe().setVisible(true);

现在我尝试使用我自己的 LAF:

<?xml version="1.0" encoding="UTF-8"?>
<synth>    
    <!-- Style that all regions will use -->
    <style id="backingStyle">
        <opaque value="TRUE"/>
        <font name="Dialog" size="14"/>
        <state>
            <color value="#04688D" type="BACKGROUND"/>
            <color value="#FFFFFF" type="FOREGROUND"/> 
        </state>
        <defaultsProperty key="Synthetica.window.decoration" type="boolean" value="true"/>
    </style>
    <bind style="backingStyle" type="region" key=".*"/>
    <style id="button">
        <!-- Shift the text one pixel when pressed -->
        <property key="Button.textShiftOffset" type="integer" value="1"/>
        <!-- set size of buttons -->
        <insets top="4" left="4" bottom="4" right="4"/>
        <state>
            <imagePainter method="buttonBackground" path="/synth/images/Button.png" sourceInsets="4 4 4 4"/>
            <font name="Dialog" size="16"/>
            <color type="TEXT_FOREGROUND" value="#FFFFFF"/>
        </state>              
        <state value="PRESSED"> 
            <imagePainter method="buttonBackground" path="/synth/images/Button_pressed.png" sourceInsets="4 4 4 4"/>
        </state>            
        <state value="MOUSE_OVER">    
            <imagePainter method="buttonBackground" path="/synth/images/Button_over.png" sourceInsets="4 4 4 4"/>
        </state>
    </style>
    <bind style="button" type="region" key="Button"/>
</synth>

我用来加载 LAF 的代码如下所示:

    SynthLookAndFeel laf = new SynthLookAndFeel();
    try{
        InputStream in = SFframe.class.getResourceAsStream("/synth/synth.xml");
        laf.load(in, SFframe.class);
        UIManager.setLookAndFeel(laf);
    }catch(ParseException | UnsupportedLookAndFeelException e){
        e.printStackTrace();
    }
    javax.swing.JFrame.setDefaultLookAndFeelDecorated(true);
    new SFframe().setVisible(true);

Buttons 和 Panels 有皮肤,当然,Window/JFrame 没有。

我只是找不到有关如何使用 Synth-XML 对 Window/JFrame 进行皮肤/装饰的资料。 有人可以帮我吗?

【问题讨论】:

  • +1 麻烦合成器 :-)

标签: java swing look-and-feel synth window-decoration


【解决方案1】:
  • AFAIK 无法用自己的 L&F 装饰 JFrame/JDialog/JWindow

  • JFrame/JDialog/JWindow 基于来自本机操作系统的对等体,默认情况下与从本机操作系统调用的其余窗口具有相同的装饰类型颜色、字体、字体大小

  • AFAIK Substance 可以做到这一点,看看它的code source, ref. post by (-:forked new Owner:-)

【讨论】:

    【解决方案2】:

    嗯,可以用你自己的 L&F 装饰 JFrameJDialog 甚至 JWindow,但我不确定 Synth 是否可以做到这一点。至少我没有找到任何相关信息。

    L&F 像 Substance、Synthetica 和其他人使用小作弊来装饰 JFrameJDialog - 当 setDefaultLookAndFeelDecorated 设置为 true JRootPane UI 禁用原生框架/对话框装饰并简单地显示其自己的样式。此外,在这种情况下,一些原生功能(如非透明框架/对话框)非常方便,让您感觉窗户实际上装饰有不同的风格(没有这些功能,您无法创建良好的窗帘效果)。

    【讨论】:

    • 而那些尝试不会work in Java7 by default
    • 是的,出于某种原因,Java 开发人员在 Java 7 及更高版本中禁用了装饰框架和对话框的此功能(这在 imo 中非常愚蠢)。这可以通过查看 JDK 7 及更高版本中的 java.awt.Dialogjava.awt.Frame setOpacity(float opacity) 方法源轻松确认。
    猜你喜欢
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 2014-02-13
    相关资源
    最近更新 更多