我想更改JButton
渐变色,
我找到了这个,http://java2everyone.blogspot.com/2009/01/set-jbutton-gradient-color.html,但我只想改变一个按钮的渐变,而不是所有的按钮
答案 0 :(得分:19)
您可以覆盖JButton
实例的paintComponent方法,并使用以下实现Graphics接口的类之一绘制其Paint对象:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public final class JGradientButtonDemo {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
final JFrame frame = new JFrame("Gradient JButton Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new FlowLayout());
frame.add(JGradientButton.newInstance());
frame.setSize(new Dimension(300, 150)); // used for demonstration
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static class JGradientButton extends JButton {
private JGradientButton() {
super("Gradient Button");
setContentAreaFilled(false);
setFocusPainted(false); // used for demonstration
}
@Override
protected void paintComponent(Graphics g) {
final Graphics2D g2 = (Graphics2D) g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
Color.WHITE,
new Point(0, getHeight()),
Color.PINK.darker()));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
public static JGradientButton newInstance() {
return new JGradientButton();
}
}
}
答案 1 :(得分:5)
比mre回答有点改进:
private static final class JGradientButton extends JButton{
private JGradientButton(String text){
super(text);
setContentAreaFilled(false);
}
@Override
protected void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
getBackground(),
new Point(0, getHeight()/3),
Color.WHITE));
g2.fillRect(0, 0, getWidth(), getHeight()/3);
g2.setPaint(new GradientPaint(
new Point(0, getHeight()/3),
Color.WHITE,
new Point(0, getHeight()),
getBackground()));
g2.fillRect(0, getHeight()/3, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
}
答案 2 :(得分:0)
TL; DR:这不可能直接实现,但可以通过Luca答案中的解决方法来完成,但是他/她的答案使用了不正确的渐变步骤。正确的列出如下。
在金属LAF中有一个硬编码的异常。如果background
属性是UIResource
的子类,则将其忽略*,并使用来自UI属性Button.gradient
的(也是硬编码的)渐变绘制按钮。否则,如果background
不是UIResource
,则背景照原样绘制。
*除非禁用该按钮,否则将没有渐变,并且UIResource
内的颜色将用作背景。
按照MetalButtonUI
的逻辑,我发现它使用的渐变来自UI属性Button.gradient
,其中包含ArrayList
:
0 = {Float} 0.3
1 = {Float} 0.0
2 = {ColorUIResource} "[221,232,243]"
3 = {ColorUIResource} "[255,255,255]"
4 = {ColorUIResource} "[184,207,229]"
进一步按照逻辑,我最终进入MetalUtils.GradientPainter.drawVerticalGradient()
。此实现将上述数据解释为*:
*假设第二个浮点为0.0,否则将绘制更多的渐变。
由于这是一个多级渐变,因此无法使用简单的GradientPaint
完成,而可以使用LinearGradientPaint
完成。但是,background
属性仅接受Color
。它甚至不能被欺骗/黑客入侵,因为最终会将实际值提供给Graphics.setColor()
而不是Graphics2D.setPaint()
(即使Metal是基于Swing而不是AWT的) Dead End。唯一的解决方案似乎完全是JButton的子类。