Java 如何为JButton设置自定义渐变?
我想做完全一样的事情,但只为我需要的一个或两个按钮设置自定义渐变,而不是为所有JButton实例。动态设置/取消设置-类似于按钮选择/取消选择模式。因此,答案如下Java 如何为JButton设置自定义渐变?,java,swing,Java,Swing,我想做完全一样的事情,但只为我需要的一个或两个按钮设置自定义渐变,而不是为所有JButton实例。动态设置/取消设置-类似于按钮选择/取消选择模式。因此,答案如下 import java.awt.Color; import java.awt.GradientPaint; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Point; import java.awt.event.ActionEvent; im
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
class JGradientButton extends JButton{
Color color1 = Color.WHITE;
Color color2 = Color.PINK;
JGradientButton(){
super("Gradient Button");
setContentAreaFilled(false);
setFocusPainted(false); // used for demonstration
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
color2 = (color2==Color.PINK) ? Color.GREEN : Color.PINK;
//System.out.println(button.isSelected());
}
});
}
@Override
protected void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
color1,
new Point(0, getHeight()),
color2));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
}
而且
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 java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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(new JGradientButton());
frame.setSize(new Dimension(300, 150)); // used for demonstration
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
所以,答案是这样的
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
class JGradientButton extends JButton{
Color color1 = Color.WHITE;
Color color2 = Color.PINK;
JGradientButton(){
super("Gradient Button");
setContentAreaFilled(false);
setFocusPainted(false); // used for demonstration
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
color2 = (color2==Color.PINK) ? Color.GREEN : Color.PINK;
//System.out.println(button.isSelected());
}
});
}
@Override
protected void paintComponent(Graphics g){
Graphics2D g2 = (Graphics2D)g.create();
g2.setPaint(new GradientPaint(
new Point(0, 0),
color1,
new Point(0, getHeight()),
color2));
g2.fillRect(0, 0, getWidth(), getHeight());
g2.dispose();
super.paintComponent(g);
}
}
而且
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 java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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(new JGradientButton());
frame.setSize(new Dimension(300, 150)); // used for demonstration
//frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
我修改了Scytharo的答案,并创建了一个简单而高级的渐变按钮 简单梯度 高级梯度
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类JGradientButton扩展了JButton{
私有静态最终长serialVersionUID=1L;
私有颜色[]停止=新颜色[2];
私人油漆颜色渐变[]=新油漆[2];
专用点[]停止点=新点[3];
公共按钮(彩色停止按钮、彩色停止按钮){
这(“”,stopTop,stopBottom);
}
公共JGradientButton(字符串文本、彩色stopTop、彩色stopTop){
这(文本、空、stopTop、stopboot);
}
公共按钮(字符串文本、图标图标、彩色停止按钮、彩色停止按钮){
超级(文本、图标);
setContentAreaFilled(假);
setFocusPainted(假);
停止点[0]=停止点;
停止[1]=停止底部;
addChangeListener(新的ChangeListener(){
@凌驾
公共无效状态已更改(更改事件e){
使无效();
}
});
}
公共无效{
super.invalidate();
停止点[0]=新点(0,0);
停止点[1]=新点(0,(int)(getHeight()*0.33));
停止点[2]=新点(0,(int)(getHeight()*1.00));
int stop=getModel().isPressed()?1:0;
颜色高亮显示=停止==0?颜色。白色:颜色。黑色;
colorGradients[0]=新的GradientPaint(停止点[0],停止点[stop],停止点[1],高亮显示);
colorGradients[1]=新的GradientPaint(停止点[1],高亮显示,停止点[2],停止点[1-停止]);
}
@凌驾
受保护组件(图形g){
Graphics2D g2=(Graphics2D)g.create();
对于(int i=0,offset=getHeight()/stopPoints.length;i
我修改了Scytharo的答案,并创建了一个简单而高级的渐变按钮
简单梯度
高级梯度
import java.awt.*;
导入javax.swing.*;
导入javax.swing.event.*;
公共类JGradientButton扩展了JButton{
私有静态最终长serialVersionUID=1L;
私有颜色[]停止=新颜色[2];
私人油漆颜色渐变[]=新油漆[2];
专用点[]停止点=新点[3];
公共按钮(彩色停止按钮、彩色停止按钮){
这(“”,stopTop,stopBottom);
}
公共JGradientButton(字符串文本、彩色stopTop、彩色stopTop){
这(文本、空、stopTop、stopboot);
}
公共按钮(字符串文本、图标图标、彩色停止按钮、彩色停止按钮){
超级(文本、图标);
setContentAreaFilled(假);
setFocusPainted(假);
停止点[0]=停止点;
停止[1]=停止底部;
addChangeListener(新的ChangeListener(){
@凌驾
公共无效状态已更改(更改事件e){
使无效();
}
});
}
公共无效{
super.invalidate();
停止点[0]=新点(0,0);
停止点[1]=新点(0,(int)(getHeight()*0.33));
停止点[2]=新点(0,(int)(getHeight()*1.00));
int stop=getModel().isPressed()?1:0;
颜色高亮显示=停止==0?颜色。白色:颜色。黑色;
colorGradients[0]=新的GradientPaint(停止点[0],停止点[stop],停止点[1],高亮显示);
colorGradients[1]=新的GradientPaint(停止点[1],高亮显示,停止点[2],停止点[1-停止]);
}
@凌驾
受保护组件(图形g){
Graphics2D g2=(Graphics2D)g.create();
对于(int i=0,offset=getHeight()/stopPoints.length;i
SriHarshaChilakapati的副本以及如何使其动态?另见此页,也是由于@mKorbel。@trashgood谢谢。但有更简单的解决办法。看到我对这个问题的回答了吗?@SriHarshaChilakapati的复制品,以及如何让它充满活力?看到另一个,也是因为@mKorbel。@trashgood谢谢。但有更简单的解决办法。看看我对这个问题的回答。
import java.awt.*;
import javax.swing.*;
import javax.swing.event.*;
public class JGradientButton extends JButton {
private static final long serialVersionUID = 1L;
private Color[] stops = new Color[2];
private Paint colorGradients[] = new Paint[2];
private Point[] stopPoints = new Point[3];
public JGradientButton(Color stopTop, Color stopBottom) {
this("", stopTop, stopBottom);
}
public JGradientButton(String text, Color stopTop, Color stopBottom) {
this(text, null, stopTop, stopBottom);
}
public JGradientButton(String text, Icon icon, Color stopTop, Color stopBottom) {
super(text, icon);
setContentAreaFilled(false);
setFocusPainted(false);
stops[0] = stopTop;
stops[1] = stopBottom;
addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
invalidate();
}
});
}
public void invalidate() {
super.invalidate();
stopPoints[0] = new Point(0, 0);
stopPoints[1] = new Point(0, (int) (getHeight() * 0.33));
stopPoints[2] = new Point(0, (int) (getHeight() * 1.00));
int stop = getModel().isPressed() ? 1 : 0;
Color highlight = stop == 0 ? Color.WHITE : Color.BLACK;
colorGradients[0] = new GradientPaint(stopPoints[0], stops[stop], stopPoints[1], highlight);
colorGradients[1] = new GradientPaint(stopPoints[1], highlight, stopPoints[2], stops[1 - stop]);
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
for (int i = 0, offset = getHeight() / stopPoints.length; i < colorGradients.length; i++) {
g2.setPaint(colorGradients[i]);
g2.fillRect(0, i * offset, getWidth(), getHeight() - (i * offset));
}
g2.dispose();
super.paintComponent(g);
}
}