如何使对象改变随机颜色

时间:2016-05-07 18:41:11

标签: java eclipse

我需要让树上的这个装饰品改变颜色,它可以用计时器或其他方法,但我一直在努力,因为我很擅长这个。我将它们设置为初始颜色并添加了一个随机颜色生成器,但不知道我的下一步是什么。

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

2 个答案:

答案 0 :(得分:0)

自从我做了这个(3年)以来已经很长时间了,但我认为这应该会给你一个关于如何解决这个问题的一般要点。

如果要更改现有形状的颜色,我认为您可以在绘制时更改图形对象。我试图在Java标准库中搜索Ovalbut 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)

我认为您的windowjava.awt.Window而您的Ovaljava.awt.Component的实例,而您正在尝试更改{{1}的颜色对象。然后,对于Oval,您需要遍历添加到flashingOrnaments的所有Oval个对象,并将背景/前景设置为window,例如:

randomColor