Java 如何为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

我想做完全一样的事情,但只为我需要的一个或两个按钮设置自定义渐变,而不是为所有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;
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);
    }
}