渐变色画布上的Java挑战

时间:2012-12-31 00:02:03

标签: java graphics gradient shapes

这可能是一个基本问题。但是,我已经完成了阅读绝对初学者Java编程的第9章,并已经接近挑战部分。我无法让程序显示从黑暗到光明的渐变。

问题是:

  

“创建一个画布,画出一边是暗的渐变,慢慢变浅        当它移动到另一边时。“

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

我认为我的主要问题是如何在程序显示一个完全黑色的正方形或者只运行第一个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]));
        }
    }
}

2 个答案:

答案 0 :(得分:4)

首先,正如我在评论中提到的,当您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); } } 。在那里,您可以覆盖绘制方法,并在屏幕上继续绘制逐渐变浅的填充矩形。这是一个小样本,可以帮助您理解我的意思:

{{1}}

产生这种背景:

enter image description here

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

答案 1 :(得分:3)

您可以在paint()中覆盖Canvas,其方式与examplePanel的方式类似。在您的实施中,使用drawImage()呈现您使用BufferedImage构建渐变的setRGB()

附录:下面的例子说明了创建随机图像的方法。您可以类似地创建渐变。

image]

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