我试图在Java中使用synth xml获取简单的平面按钮。此按钮应包含纯色背景和文本,没有其他效果。
我已经检查了一些教程并成功实现了以下解决方案,我需要为按钮提供纯色背景图像。
<state>
<imagePainter method="buttonBackground" path="images/button_press.png" sourceInsets="10 10 10 10"/>
<font name="Dialog" size="16"/>
<color type="TEXT_FOREGROUND" value="#FFFFFF"/>
</state>
但是根据合成文档here我应该能够为按钮提供背景颜色而不是使用图像。我已尝试过以下XML设置。但它没有将任何背景应用于按钮。而它正在为文本应用提供的颜色。
<state>
<font name="Verdana" size="14"/>
<color value="#FF0000" type="BACKGROUND"/>
<color value="#000000" type="TEXT_FOREGROUND"/>
</state>
任何人都可以检查并帮助我找出我所犯的错误,或者还有其他解决办法吗?
答案 0 :(得分:3)
我想您需要使用<opaque value="true" />
来绘制JButton
的背景:
<强> button.xml 强>
<synth>
<style id="default">
<font name="Dialog" size="16" />
</style>
<bind style="default" type="region" key=".*" />
<style id="ButtonTest">
<opaque value="true" />
<insets top="10" bottom="10" left="10" right="10" />
<state>
<font name="Verdana" size="14" />
<color type="BACKGROUND" value="#FF0000" />
<color type="TEXT_FOREGROUND" value="#000000" />
</state>
<state value="MOUSE_OVER">
<color type="BACKGROUND" value="ORANGE" />
<color type="TEXT_FOREGROUND" value="WHITE" />
</state>
<state value="PRESSED">
<color type="BACKGROUND" value="GREEN" />
<color type="TEXT_FOREGROUND" value="WHITE" />
</state>
</style>
<bind style="ButtonTest" type="region" key="Button" />
</synth>
<强> SynthButtonTest.java 强>
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.synth.*;
public class SynthButtonTest {
public JComponent makeUI() {
JPanel p = new JPanel();
p.add(new JButton("JButton1"));
p.add(new JButton("JButton2"));
p.add(new JButton("JButton3"));
return p;
}
public static void main(String... args) {
EventQueue.invokeLater(() -> {
try {
Class<?> c = SynthButtonTest.class;
SynthLookAndFeel synth = new SynthLookAndFeel();
synth.load(c.getResourceAsStream("button.xml"), c);
UIManager.setLookAndFeel(synth);
} catch (Exception ex) {
ex.printStackTrace();
}
JFrame f = new JFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.getContentPane().add(new SynthButtonTest().makeUI());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}