我需要让树上的这个装饰品改变颜色,它可以用计时器或其他方法,但我一直在努力,因为我很擅长这个。我将它们设置为初始颜色并添加了一个随机颜色生成器,但不知道我的下一步是什么。
int ornament = (int)(5 * this.scale);
Oval blueornament = new Oval(this.x - (int)(10 * this.scale), this.y - (int)(10 * this.scale), 2 * ornament, 2 * ornament, Color.blue, true);
Oval yellowornament = new Oval(this.x + (int)(10 * this.scale), this.y - (int)(20 * this.scale), 2 * ornament, 2 * ornament, Color.yellow, true);
Oval redornament = new Oval(this.x + (int)(15 * this.scale), this.y + (int)(5 * this.scale), 2 * ornament, 2 * ornament, Color.red, true);
this.window.add(trunk);
this.window.add(foliage);
this.window.add(foliage2);
this.window.add(foliage3);
this.window.add(blueornament);
this.window.add(yellowornament);
this.window.add(redornament);
public void flashOrnaments() {
Random rand = new Random();
float r = rand.nextFloat();
float g = rand.nextFloat();
float b = rand.nextFloat();
Color randomColor = new Color(r, g, b);
}
答案 0 :(得分:0)
自从我做了这个(3年)以来已经很长时间了,但我认为这应该会给你一个关于如何解决这个问题的一般要点。
如果要更改现有形状的颜色,我认为您可以在绘制时更改图形对象。我试图在Java标准库中搜索Oval
,but there isn't one,所以看起来你自己做了这个。
所以我会改变Oval
类看起来像这样:
public class Oval extends JPanel {
private Color color;
public Oval(Color color) {
this.color = color.
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(this.color);
}
public void changeColor(Color color) {
this.color = color;
repaint();
}
}
然后调用像blueornament.setColor(Color.red)
这样的东西应该有效。
现在,如果你想为我所假设的颜色设置动画,因为你正在谈论一个计时器,你可以按照编程方式设置颜色,在'步骤'直到你达到所需的颜色(未经测试,只是为了给出一般的想法):
Color oldColor = Oval.color;
Color newColor = randomColor();
// Calculate the difference between the old and new color
int rdiff = (oldColor.getRed() - newColor.getRed()) / 20;
int gdiff = (oldColor.getGreen() - newColor.getGreen()) / 20;
int bdiff = (oldColor.getBlue() - newColor.getBlue()) / 20;
for (int i = 0; i < 20; i++) {
// Programmatically setup timers, because Thread.sleep() doesn't work here
int delay = 10 * i;
ActionListener taskPerformer = new ActionListener() {
public void actionPerformed(ActionEvent evt) {
// Get the current color and step one further
int red = Oval.color.getRed() + rdiff;
int green = Oval.color.getGreen() + gdiff;
int blue = Oval.color.getBlue() + bdiff;
oval.setColor(new Color(red, green, blue));
}
};
new Timer(delay, taskPerformer).start();
}
希望这能让你走上正轨!
答案 1 :(得分:0)
我认为您的window
是java.awt.Window
而您的Oval
是java.awt.Component
的实例,而您正在尝试更改{{1}的颜色对象。然后,对于Oval
,您需要遍历添加到flashingOrnaments
的所有Oval
个对象,并将背景/前景设置为window
,例如:
randomColor