Java-LAF: как создать Декорацию, используя Synth-XML?

Я пытаюсь создать собственный внешний вид с помощью Synth-Framework.

Я успешно использовал учебник ( Look-and-Feel Tutorial от 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);

Кнопки и панели обшиваются кожей, но, конечно, Window / JFrame - нет.

Я просто не могу найти источник о том, как оформить / декорировать Window / JFrame с помощью Synth-XML. Может ли кто-нибудь помочь мне там?

2 ответа

Ну можно украсить JFrame, JDialog и даже JWindow с вашим собственным L&F, но я не уверен, что Synth может сделать это. По крайней мере, я не нашел никакой информации об этом.

L&F, такие как Substance, Synthetica и другие, используют небольшой чит для украшения JFrame а также JDialog - когда setDefaultLookAndFeelDecorated установлен в true Интерфейс JRootPane отключает встроенное оформление рамок / диалогов и просто отображает собственный стиль. Кроме того, некоторые встроенные функции, такие как непрозрачные рамки / диалоги, очень удобны в этом случае и позволяют вам почувствовать, что окно на самом деле оформлено в другом стиле (вы не можете создать хороший эффект затенения окна без этих функций).

  • AFAIK не возможно для украшения JFrame / JDialog / JWindow с собственным L & F

  • JFrame / JDialog / JWindow основан на пирах, пришедших из родной ОС, по умолчанию имеет тот же цвет украшения, шрифт и размер шрифта, что и остальные окна, вызванные из родной ОС

  • AFAIK Вещество может сделать это, взгляните на его исходный код, ref. сообщение от (-: разветвленный новый владелец:-)

Другие вопросы по тегам