JavaLAF:如何使用SynthXML创建装饰?
我正在尝试使用Synth框架创建自定义的外观 我成功地使用了教程( )进行试验,并设法对按钮、面板等进行蒙皮 我现在的问题是,我想装饰一下窗户/窗框 我读了一些关于它的文章,并用MetalLookAndFeel和以下代码进行了尝试:JavaLAF:如何使用SynthXML创建装饰?,java,swing,look-and-feel,synth,window-decoration,Java,Swing,Look And Feel,Synth,Window Decoration,我正在尝试使用Synth框架创建自定义的外观 我成功地使用了教程( )进行试验,并设法对按钮、面板等进行蒙皮 我现在的问题是,我想装饰一下窗户/窗框 我读了一些关于它的文章,并用MetalLookAndFeel和以下代码进行了尝试: try{ UIManager.setLookAndFeel(new MetalLookAndFeel()); }catch(UnsupportedLookAndFeelException e){ } javax.sw
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>
按钮和面板会被剥皮,但当然,窗口/框架不会
我就是找不到关于如何使用SynthXML对窗口/JFrame进行蒙皮/装饰的源代码。
有人能帮我吗?- AFAIK无法用自己的L&F装饰
/JFrame
/JDialog
JWindow
/JFrame
/JDialog
基于来自本机操作系统的对等方,默认情况下,与从本机操作系统调用的其余窗口具有相同的颜色、字体、字体大小JWindow
- 一种物质可以做到这一点,看看它的
JFrame
,JDialog
,甚至JWindow
,但我不确定Synth是否能做到这一点。至少我没有找到任何关于那件事的信息
类似L&F的Substance、Synthetica和其他公司使用一个小欺骗来装饰
JFrame
和JDialog
——当setDefaultLookAndFeelDecorated
设置为true
JRootPane UI禁用本机框架/对话框装饰,并简单地显示自己的样式。此外,一些本机功能(如非不透明框架/对话框)在这种情况下非常方便,让您感觉窗实际上是用不同的样式装饰的(没有这些功能,您无法创建良好的窗阴影效果)。+1因为需要使用synth:-)而这些尝试没有成功,出于某种原因,Java开发人员在Java7和更高版本中禁用了装饰框架和对话框的此功能(这在我看来相当愚蠢)。通过查看JDK 7及更高版本中的java.awt.Dialog
或java.awt.Frame
setOpacity(float opacity)
方法源代码,可以很容易地确认这一点。
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);