0

这大概是个初级问题。但是,我已经阅读了面向绝对初学者的 Java 编程的第 9 章,并进入了挑战部分。我不能完全让程序显示从暗到亮的渐变。

问题问:

“创建一个画布,在一侧绘制一个深色的渐变,然后在向另一侧移动时逐渐变亮。”

我看过Java Challenge on Creating a Canvas page(我之前问过这个问题),并且对创建颜色渐变画布有了更好的理解,但是我仍然遇到了很大的困难。

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

这个问题的答案可能有助于许多新的 Java 程序员理解图形和画布。

我不知道 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]));
        }
    }
}
4

2 回答 2

4

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

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

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

这产生了这个背景:

在此处输入图像描述

我仍然推荐阅读GradientPaint,它使这个过程变得更容易和更好。

于 2012-12-31T02:05:21.670 回答
3

paint()您可以Canvas以类似于此示例Panel. 在您的实现中,用于drawImage()渲染BufferedImage您用来setRGB()构建渐变的 a。

附录:下面的示例通过创建随机图像来说明该方法。您可以类似地创建渐变。

图片]

import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

/** @see https://stackoverflow.com/a/14096121/230513 */
public class AWTImage {

    public static void main(String[] args) throws IOException {
        Frame frame = new Frame();
        frame.add(new ImageCanvas());
        frame.addWindowListener(new WindowAdapter() {

            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
        frame.pack();
        frame.setVisible(true);
    }

    private static class ImageCanvas extends Canvas {

        private static final Random r = new Random();
        private BufferedImage image;

        public ImageCanvas() {
            image = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB);
            for (int row = 0; row < image.getHeight(); row++) {
                for (int col = 0; col < image.getWidth(); col++) {
                    image.setRGB(col, row, r.nextInt());
                }
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(image.getWidth(), image.getHeight());
        }

        @Override
        public void paint(Graphics g) {
            g.drawImage(image, 0, 0, this);
        }
    }
}
于 2012-12-31T00:20:21.980 回答