我试图在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>
但是根据这里的synth文档,我应该能够为按钮提供背景颜色,而不是使用图像。我已经尝试了下面的XML设置相同。但是它没有给按钮应用任何背景。而它将提供的颜色应用于文本。
<state>
<font name="Verdana" size="14"/>
<color value="#FF0000" type="BACKGROUND"/>
<color value="#000000" type="TEXT_FOREGROUND"/>
</state>
谁能检查并帮助我找出我所做的错误或有其他解决方案吗?
我猜你需要使用<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);
});
}
}