0

コンテナにオブジェクトのコピーが2つあり、それらは同期されています(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);
        }
}

したがって、setColorは、可能な色オプションを作成するときにinitで呼び出され、ユーザーがキーを押して色を変更するとtoggleColourで呼び出され、レンダリングで使用されますが、常に現在の色に再設定されます。

奇妙なことif (temp.equals(Color.black))に、フリップが発生したときに条件が入力されるためbb.setColor(temp)、前のレンダリングでは発生しなかったようです...
なぜこれが発生し、どうすれば修正できますか?

4

1 に答える 1

0

元のプログラムが機能しない理由がわかりませんが、このソリューションは問題を解決します。
(グローバル) Color 変数を作成し、この変数を init と toggleColour に設定すると、レンダリングで使用でき、temp 変数について心配する必要がなくなります (取得したい色の唯一のインスタンス)。なんとなく紛失。そう:

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);
    }
}
于 2012-06-29T06:02:52.813 に答える