【问题标题】:How to set custom gradient for JButton?如何为 JButton 设置自定义渐变?
【发布时间】:2012-09-26 19:02:34
【问题描述】:

我想做与this 完全一样的事情,但只为我需要的一两个按钮设置自定义渐变,而不是为所有 JButton 实例。并动态设置/取消设置 - 类似于按钮选择/取消选择模式。

【问题讨论】:

  • @SriHarshaChilakapati 以及如何动态地制作它?
  • 看到另一个example,也是由于@mKorbel。
  • @trashgod 谢谢。但有更简单的解决方案。看看我对这个问题的回答。

标签: java swing


【解决方案1】:

所以,这就是答案。

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);
    }


}

【讨论】:

    【解决方案2】:

    我已经修改了 scythargon 的答案并创建了一个简单而高级的渐变按钮。

    import java.awt.*;
    import javax.swing.*;
    
    public class ButtonGradientTest {
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    try {
                        UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
    
                    createAndShowGUI();
                }
            });
        }
    
        protected static void createAndShowGUI() {
            JFrame  frame   = new JFrame("Button Color Test");
            JPanel  panel1  = new JPanel(new FlowLayout());
            JPanel  panel2  = new JPanel(new FlowLayout());
            JButton button1 = new JGradientButtonSimple("Simple", Color.RED, Color.ORANGE);
            JButton button2 = new JGradientButton("Advanced", Color.GREEN, Color.BLUE);
    
            button1.setPreferredSize(new Dimension(100, 100));
            button1.setForeground(Color.YELLOW);
            button2.setPreferredSize(new Dimension(100, 100));
            button2.setForeground(Color.MAGENTA);
    
            panel1.add(button1);
            panel2.add(button2);
            frame.add(panel1, BorderLayout.WEST);
            frame.add(panel2, BorderLayout.EAST);
    
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    }
    

    简单渐变

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    
    public class JGradientButtonSimple extends JButton {
        private static final long serialVersionUID = 1L;
        private Color stopTop;
        private Color stopBottom;
        private Paint colorGradient;
        private Point[] stopPoints = new Point[2];
    
        public JGradientButtonSimple(Color stopTop, Color stopBottom) {
            this("", stopTop, stopBottom);
        }
    
        public JGradientButtonSimple(String text, Color stopTop, Color stopBottom) {
            this(text, null, stopTop, stopBottom);
        }
    
        public JGradientButtonSimple(String text, Icon icon, Color stopTop, Color stopBottom) {
            super(text, icon);
    
            setContentAreaFilled(false);
            setFocusPainted(false);
    
            this.stopTop = stopTop;
            this.stopBottom = 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, getHeight());
    
            if (getModel().isPressed()) {
                colorGradient = new GradientPaint(stopPoints[0], stopBottom, stopPoints[1], stopTop);
            } else {
                colorGradient = new GradientPaint(stopPoints[0], stopTop, stopPoints[1], stopBottom);
            }
        }
    
        @Override
        protected void paintComponent(Graphics g) {
            Graphics2D g2 = (Graphics2D) g.create();
    
            g2.setPaint(colorGradient);
            g2.fillRect(0, 0, getWidth(), getHeight());
            g2.dispose();
    
            super.paintComponent(g);
        }
    }
    

    高级渐变

    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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-19
      • 2017-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-03
      相关资源
      最近更新 更多