渐变颜色 Canvas 上的 Java 挑战

标签 java graphics gradient shapes

这可能是一个基本问题。不过,我已经阅读完《Java 初学者编程》第 9 章,并已接近“挑战”部分。我无法完全让程序显示从暗到亮的渐变。

问题提出:

"Create a Canvas that paints a gradient that's dark on one side and slowly gets lighter as it moves to the other side."

我看过Java Challenge on Creating a Canvas页面(我之前问过)并更好地了解了创建颜色渐变 Canvas ,但是,我仍然遇到很大困难。

我认为我的主要问题是如何在程序显示完全黑色的方 block 或仅使用第一个 for 循环运行时显示完全白色的方 block 时获得介于两者之间的灰色。我认为我的 for 循环有问题并且没有正确识别变量。

这个问题的答案可能会帮助许多新的 Java 程序员理解 Graphics 和 Canvas。

我不知道 JFrame、Swing、Points、JPanels、BufferedImage 或 GradientPaint。

非常感谢您就此事所花费的时间和合作。

这是代码:

import java.awt.*;

public class RandomColorSquare extends GUIFrame {
    Canvas slight;
    public final static int MIN = 0,
        MAX = 225;

    public RandomColorSquare(int r, int g, int b) {
        super("Random Color Square");
        r = r >= MIN && r <= MAX ? r : MIN;
        g = g >= MIN && g <= MAX ? g : MIN;
        b = r >= MIN && b <= MAX ? b : MIN;
        slight = new Canvas();
        slight.setBackground(new Color(r,g, b));
        slight.setSize(200, 150);
        add(slight, BorderLayout.CENTER);

        for(r=0; r<225; r++) {
            Color c = slight.getBackground().brighter();
            slight.setBackground(c);
        }

        for (g=0; g<225; g++) {
            Color d = slight.getBackground().darker();
            slight.setBackground(d);
        }
        for (b=0; b<225; b++) {
             Color e = slight.getBackground().darker();
             slight.setBackground(e);
        }

        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        if (args.length != 3) {
            new RandomColorSquare(0, 0, 0);
        }
        else {
            new RandomColorSquare(Integer.parseInt(args[0]),                                     Integer.parseInt(args[1]),
                   Integer.parseInt(args[2]));
        }
    }
}

最佳答案

首先,正如我在评论中提到的,当您 setBackground 时,您正在更改 Canvas 的背景,而不是添加它。因此,无论您将其设置为最后什么,您都会看到什么。就你而言,这是蓝色的最暗形式,它只是黑色。如果注释掉最后两个循环,您将得到白色背景(最亮的红色)。

但是。仅使用您所知道的,这是我能想到的最好的方法。它涉及创建您自己的自定义 Canvas,我将其称为 CustomCanvas。在那里,您可以覆盖绘画方法并继续在屏幕上绘制逐渐变浅的填充矩形。这是一个小示例,可以帮助您理解我的意思:

class CustomeCanvas extends Canvas{
    public void paint(Graphics g){
        Color background = new Color(30,30,120); //Set this accordingly
        for(int i=0;i<getWidth();i++){
            g.setColor(background);
            background = getBrighter(background);
            g.fillRect(i,0, 1, getHeight());
        }
    }

    private Color getBrighter(Color c) {
        int r = c.getRed();
        int g = c.getGreen();
        int b = c.getBlue();

        if(r< MAX) r+=1;
        if(g< MAX) g+=1;
        if(b< MAX) b+=1;

        return new Color(r,g,b);
    }
}

产生这样的背景:

enter image description here

我仍然建议阅读 GradientPaint这使得这个过程变得更加容易和愉快。

关于渐变颜色 Canvas 上的 Java 挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096002/

相关文章:

java - 如何从 C++ JNI 获取 Java 枚举?

java - 如何在 Oracle Weblogic 管理员控制台上正确部署 EAR 文件

java - 我需要做什么来用渐变绘画复制这个组件?

Java2d : Set gradient for a lines

c# - 缩放到c#中的一个点

html - CSS - 使用类的渐变 "border"

java - 如何在 Spring 3 MVC 中执行触发过滤器的@CustomAnnotation 注释?

java - android 应用程序/Activity 生命周期 : when should we save to flash?

css - 如何减小 css 渐变图案的大小

带有渐变笔划的 SVG 线不会直接显示