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 & FJFrame
/JDialog
/JWindow
основан на пирах, пришедших из родной ОС, по умолчанию имеет тот же цвет украшения, шрифт и размер шрифта, что и остальные окна, вызванные из родной ОСAFAIK Вещество может сделать это, взгляните на его исходный код, ref. сообщение от (-: разветвленный новый владелец:-)