为什么我的物体的颜色会随机变化?

时间:2012-06-29 05:09:09

标签: java colors

我的容器中有一个对象的两个副本,它们是同步的(不是在Java意义上,只是在我对一个人做的事情上,我也对另一个做了)。它们都会描绘出使用箭头键绘制的图案 问题是颜色偶尔会随机地恢复为黑色(不可预测)(而不是两个对象同时)。 以下是我认为的所有相关代码;肯定一直都会调用setColor:

public class UserRavelDialog extends Component implements Runnable {
...
in init():
colors = new Color[] { 
            new Color (245, 240, 80),   //set colors for the elements
            new Color (100, 50, 50),    
            new Color (255, 0, 0),      
            new Color (255, 0, 200),    
            new Color (0, 0, 200)};     

    bb.setColor(colors[0]);  //bb is the backbuffer graphics object

public void render(){    //this draws the current color around a black cursor, or white if inactive
    Color temp = bb.getColor();

    if(temp.equals(Color.black))
        System.out.print("!");

    if (!isActive)
        bb.setColor(Color.white);
    bb.fillRect((int)p.x - 1, (int)p.y - 1, 3, 3); //p is a Point2D.Double for the cursor position
    bb.setColor(Color.black);
    bb.fillRect((int)p.x, (int)p.y, 1, 1);
    bb.setColor(temp);

    update(getGraphics());
}

private void toggleColour(int arg) {
    if (arg < colors.length)
        bb.setColor(colors[arg]);
}

public void keyPressed(KeyEvent e){
for (int i = 0 ; i < colors.length ; i++){
            if (e.getKeyCode() == keys[i+9])
                toggleColour(i);
        }
}

因此,当我创建可能的颜色选项时,在init中调用setColor,当用户按下一个键来更改颜色时,在toggleColour中调用setColor,并且它在渲染中使用,但始终重新设置为当前颜色。

奇怪的是,当翻转发生时,if (temp.equals(Color.black))条件被输入,所以看起来bb.setColor(temp)刚刚在前一个渲染中没有发生...
为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:0)

这个解决方案解决了这个问题,即使我不明白为什么原始程序不起作用 如果你创建一个(全局)Color变量,并在init和toggleColour中设置这个变量,你可以在渲染中使用它,你不需要担心临时变量(你想要回来的颜色的唯一实例)不知何故迷路了。所以:

in init():
currColor = colors[0];
bb.setColor(currColor);

public void render(){
    if (!iActive)
        bb.setColor(Color.white);
    bb.fillRect((int)p.x - 1, (int)p.y - 1, 3, 3);
    bb.setColor(Color.black);
    bb.fillRect((int)p.x, (int)p.y, 1, 1);
    bb.setColor(currColor);

    update(getGraphics());
}
private void toggleColour(int arg) {
    if (arg < colors.length) {
        currColor = colors[arg];
        bb.setColor(currColor);
    }
}