Java 3 颜色渐变

2023-11-26

我有一个JPanel,我想在其中绘制渐变。我有下面的代码,但只绘制了 2 种颜色的渐变。我想添加第三个,但不知道如何。我想要的是将面板的左上角设置为白色,右上角设置为红色,两个底角设置为黑色。为了实现这一目标,我必须做什么,看起来像这样:

Example Gradient

package pocketshop.util;

import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import javax.swing.JPanel;

public class ColorPicker extends JPanel{

    public ColorPicker(){
        repaint();
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        int w = getWidth();
        int h = getHeight();

        GradientPaint gp = new GradientPaint(
                0, 0, Color.white,
                0, h, Color.black);

        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }
}



编辑:可能的解决方案

我能够想出使用 2 个渐变,一个水平,一个垂直,如下所示:

    public void paintComponent(Graphics g){
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D)g;
        int w = getWidth();
        int h = getHeight();

        // Vertical
        GradientPaint gp = new GradientPaint(
                0, 0, new Color(0,0,0,0),
                0, h, Color.black);

        // Horizontal
        GradientPaint gp2 = new GradientPaint(
                0, 0, Color.white,
                w, 0, Color.red, true);

        g2d.setPaint(gp2);
        g2d.fillRect(0, 0, w, h);
        g2d.setPaint(gp);
        g2d.fillRect(0, 0, w, h);
    }

像这样的东西吗?

Three way Color Gradient

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import javax.imageio.ImageIO;
import javax.swing.*;

public class ThreeWayGradient {

    public static void main(String[] args) {
        final BufferedImage image = new BufferedImage(
                200, 200, BufferedImage.TYPE_INT_RGB);
        Runnable r = new Runnable() {
            @Override
            public void run() {
                Graphics2D g = image.createGraphics();
                GradientPaint primary = new GradientPaint(
                        0f, 0f, Color.WHITE, 200f, 0f, Color.ORANGE);
                GradientPaint shade = new GradientPaint(
                        0f, 0f, new Color(0, 0, 0, 0),
                        0f, 200f, new Color(0, 0, 0, 255));
                g.setPaint(primary);
                g.fillRect(0, 0, 200, 200);
                g.setPaint(shade);
                g.fillRect(0, 0, 200, 200);

                JLabel l = new JLabel(new ImageIcon(image));
                JOptionPane.showMessageDialog(null, l);
                File f = new File(System.getProperty("user.home"),
                        "ThreeWayGradient.png");
                try {
                    ImageIO.write(image, "png", f);
                } catch (IOException ex) {
                    ex.printStackTrace();
                }
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

使其成为工厂方法

..因为它更漂亮。

ThreeWayGradient as factory method

import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;

public class ThreeWayGradient {

    public static BufferedImage getThreeWayGradient(
            int size,
            Color primaryLeft,
            Color primaryRight,
            Color shadeColor) {
        BufferedImage image = new BufferedImage(
                size, size, BufferedImage.TYPE_INT_RGB);

        Graphics2D g = image.createGraphics();
        GradientPaint primary = new GradientPaint(
                0f, 0f, primaryLeft, size, 0f, primaryRight);
        int rC = shadeColor.getRed();
        int gC = shadeColor.getGreen();
        int bC = shadeColor.getBlue();
        GradientPaint shade = new GradientPaint(
                0f, 0f, new Color(rC, gC, bC, 0),
                0f, size, shadeColor);
        g.setPaint(primary);
        g.fillRect(0, 0, size, size);
        g.setPaint(shade);
        g.fillRect(0, 0, size, size);

        g.dispose();
        return image;
    }

    /**
     * Presumed to have a layout that shows multiple components.
     */
    public static void addGradient(
            JPanel p, int s, Color pL, Color pR, Color sh) {

        JLabel l = new JLabel(new ImageIcon(getThreeWayGradient(s, pL, pR, sh)));
        p.add(l);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new GridLayout(2,4,1,1));
                addGradient(gui,100,Color.YELLOW,Color.RED,Color.GREEN);
                addGradient(gui,100,Color.GREEN,Color.YELLOW,Color.RED);
                addGradient(gui,100,Color.RED,Color.GREEN,Color.YELLOW);
                addGradient(gui,100,Color.BLUE,Color.MAGENTA,Color.PINK);
                addGradient(gui,100,Color.WHITE,Color.RED,Color.BLACK);
                addGradient(gui,100,Color.RED,Color.GREEN,Color.BLACK);
                addGradient(gui,100,Color.BLUE,Color.PINK,Color.BLACK);
                addGradient(gui,100,Color.BLUE,Color.CYAN,Color.BLACK);
                JOptionPane.showMessageDialog(null, gui);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java 3 颜色渐变 的相关文章

随机推荐

  • 如何在支持 Python 3 的 OSX 上安装 vim?

    我安装时遇到问题vim with python 3 for MacOS 我知道有一个类似的类似的问题关于那个话题 但我无法解决问题 首先我跑了vim version并得到了 Included patches 1 503 505 680 68
  • 如何从 Firebase 实时数据库导出数据?

    我正在使用 Firebase 进行开发 并将数据存储在实时数据库 我需要在 Stack Overflow 上分享我的数据库结构以解决问题 或者在进行重大更改之前进行备份 如何使用 Firebase 控制台执行此操作 数据可以从 Fireba
  • 使用 PowerShell 在远程服务器上安装证书

    我想在远程服务器上安装使用 makecert exe 创建的证书 X 509 我无法使用 psexec 或类似的东西 但必须使用 PowerShell 服务器操作系统 Windows Server 2008 R2 PowerShell 版本
  • Meteor 找到带有 id 的对象

    假设我有一个 id 字符串 看起来像557fba5a8032a674d929e6a1它存储在会话中 我尝试检索一个文档 其 id与上面相同 但即使它存在我也找不到它 Posts findOne id 557fba5a8032a674d929
  • 将 2500 个 geoJSON 多边形渲染到传单地图上

    我一直在寻找但似乎找不到解决方案 我有一个大小为 170mb 的 GeoJSON 文件 它包含大约 2500 个多边形 不知何故 我需要将其渲染为传单地图 显然以这样的规模我没有机会 呈现这些数据的最简单方法是什么 我是否能够创建一个完整的
  • django中如何动态创建权限?

    现在我可以使用 Django 组模块创建新组 from django contrib auth models import Group我可以为组分配权限 例如我创建了一个新组 人力资源 by Group name HR 现在我想创建像这样的
  • 如何将 javascript 值设置为 jinja 变量

    我知道我们可以像这样将 Jinja 变量设置为 js 变量 var x value 但我正在尝试做相反的事情 即我正在尝试将 javascript 值设置为 jinja 变量 我尝试了以下方法 但没有任何效果 value x set val
  • .zshrc 配置文件语法错误

    我在 zshrc 文件中的某处遇到语法错误 但我似乎找不到它 我收到此错误消息 zshrc 49 bad assignment 这是我的 zshrc 文件 Path to your oh my zsh configuration ZSH H
  • R:数据框中的重音字符

    我很困惑为什么某些字符 例如 和 在数据框中丢失了变音标记 而其他字符 例如 和 却没有 顺便说一句 我的操作系统是 Windows 10 在下面的示例代码中 向量 czechvec 有 11 个单字符字符串 全部是斯拉夫重音字符 R 正确
  • 学说合并:日期时间字段始终更新

    我用现有的实体创建一个新实体Id 我想更新相关的数据库记录 教义merge一直是我最好的朋友 识别是否有更改并生成正确的更新查询 entity new Entity entity gt setId 1 entity gt setName t
  • 如何使用 stringr 的 Replace_all() 函数替换字符串中的特定匹配项

    The stringr包有帮助str replace and str replace all 功能 例如 mystring lt one fish two fish red fish blue fish str replace mystri
  • Keras 极高的损失

    我试图通过特征来预测价格 我选择了一个非常简单的模型 但它的工作原理很奇怪 损失函数非常高 我看不出问题出在哪里 这是我的模型 define base model def baseline model create model model
  • 在Java流中添加多个字段(以及条件流操作)

    假设我有这门课 public class Thing private BigDecimal field1 private BigDecimal field2 private BigDecimal otherField1 private Bi
  • php中数组的右旋转

    例如我有一个数组 a 1 2 3 4 5 由此 a 如何获取最后一个并将其设置为第一个 5 1 2 3 4 我如何将最后两个数组变成这样 4 5 1 2 3 您可以结合使用array pop which pops数组的最后一个元素 以及ar
  • 通过 python 在脚本中使用密码 ssh 到远程计算机

    我正在使用远程机器 每次我需要验证文件更新时间时 我都必须使用 ssh 并且有多个脚本可以通过 ssh 连接到远程计算机 我在网上查了一下 但找不到符合我要求的 我试图找到一个使用 ssh 的 python 脚本 并且密码也在脚本中 因为我
  • 始终在 jQuery 自动完成中显示特定选择,即使它与输入不匹配

    我有一个 jQuery 自动完成 jquery ui 版本 1 8 我可以在其中输入一个名称 如果可用 我希望用户从列表中选择一个名称 因为这些是我们数据库中的所有者名称 但是 有时他们需要添加新的所有者名称 在这种情况下 我希望他们从自动
  • 为证书提供 EC 私钥以在 HttpClient C# 中使用

    我有一个可以使用 X509Certificate2 类读取的证书 如下所示 X509Certificate2 证书 new X509Certificate2 certificate pem 但我也有一个EC私钥 这是它的文件内容 BEGIN
  • 如何获取以毫秒为单位的时间差

    我无法解决这个问题 所以我希望有人能提供帮助 我有一首歌曲 歌曲长度以毫秒为单位 我还有以 DATETIME 格式播放歌曲的日期 我想做的是找出歌曲播放时间还剩多少毫秒 Example tracktime 219238 dateplayed
  • requiredFieldValidator 要求用户单击两次

    我有一个简单的网络表单 其中有一个文本框和一个连接到它的RequiredFieldValidator 当触发RequiredFieldValidator错误时 用户必须单击提交两次才能发布表单 第一次单击会清除错误 第二次单击实际上会触发按
  • Java 3 颜色渐变

    我有一个JPanel 我想在其中绘制渐变 我有下面的代码 但只绘制了 2 种颜色的渐变 我想添加第三个 但不知道如何 我想要的是将面板的左上角设置为白色 右上角设置为红色 两个底角设置为黑色 为了实现这一目标 我必须做什么 看起来像这样 p