这可能是一个基本问题。不过,我已经阅读完《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);
}
}
产生这样的背景:
我仍然建议阅读 GradientPaint这使得这个过程变得更加容易和愉快。
关于渐变颜色 Canvas 上的 Java 挑战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14096002/