0

これはおそらく初歩的な質問です。しかし、Java Programming for the Absolute Beginner の第 9 章を読み終え、Challenges セクションに近づいてきました。私はプログラムに暗いものから明るいものへのグラデーションを表示させることができません。

質問は尋ねます:

「片側が暗く、反対側に移動するにつれてゆっくりと明るくなるグラデーションをペイントする Canvas を作成します。」

キャンバス ページの作成に関する Java チャレンジ(以前に質問したもの) を見て、カラー グラデーション キャンバスの作成について理解を深めましたが、まだ大きな問題があります。

私の主な問題は、プログラムが完全に黒い四角形を示しているとき、または最初の for ループだけで完全に白い四角形を実行しているときに、その間にグレーの色を取得する方法だと思います。私の 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]));
        }
    }
}
4

2 に答える 2

4

まず、コメントで述べたように、setBackgroundの背景を変更するときはCanvas、追加するのではありません。したがって、最後に設定したものは何でも表示されます。あなたの場合、それは青の最も暗い形で、ただの黒です。最後の 2 つのループをコメント アウトすると、白い背景 (最も明るい赤) が得られます。

でも。あなたが知っていることだけを使って、これが私が思いつくことができる最高のものです. 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()オーバーライドできます。実装では、グラデーションの構築に使用した をレンダリングするために使用します。CanvasPaneldrawImage()BufferedImagesetRGB()

補遺: 以下の例は、ランダムな画像を作成することによるアプローチを示しています。グラデーションも同様に作成できます。

画像]

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 に答える