2

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

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

我现在的问题是,我想装饰 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 进行皮肤/装饰的资料。有人可以帮我吗?

4

2 回答 2

1

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

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

于 2013-05-14T10:43:56.683 回答
1
  • AFAIK 不可能用自己的 L&F装饰JFrame//JDialogJWindow

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

  • AFAIK Substance 可以做到这一点,看看它的代码源,参考。(-:forked new Owner:-) 发帖

于 2013-05-14T07:42:07.137 回答