0

学校ではメモリーというゲームを作る必要がありますが、私のものはうまくいきません。私はすでにすべてのカードを持っており、向きを変えることもできますが、javafx が色を比較し、色が一致しない場合はカードを元に戻す方法、または色が一致する場合はカードを消す方法がわかりません。皆さん、私を助けてくれませんか? これはコードの一部です:

d = Rectangle {
width: bind 150
height: bind 150
x: bind 500
y: bind 20
arcWidth: 20
arcHeight: 20
fill:  Color.GREEN
stroke: Color.BLACK
strokeWidth: 1.0
onMouseClicked:function(a: MouseEvent)
        {
           if(d.fill == Color.GREEN)
            d.fill = Color1.YELLOW
         else
            d.fill = Color.GREEN
        }
}
 if(Color1.equals("yellow"))
             && (Color2.equals("yellow"))
 {
  d.setVisible(false);
  j.setVisible(false);

 }
4

1 に答える 1

1

バージョン 2.X

JavaFX は明らかに部分的にオープン ソースです (スタック オーバーフロー リファレンス)。そのリンクから、バージョン2.Xequals()のクラスのメソッドへのソース コードを見つけました。Color

/**
 * Indicates whether some other object is "equal to" this one.
 * @param obj the reference object with which to compare.
 * @return {@code true} if this object is equal to the {@code obj} argument; {@code false} otherwise.
 */
@Override public boolean equals(Object obj) {
    if (obj == this) return true;
    if (obj instanceof Color) {
        Color other = (Color) obj;
        return red == other.red
            && green == other.green
            && blue == other.blue
            && opacity == other.opacity;
    } else return false;
}

明らかに、redgreenblue、およびopacityは同じである必要があります。

バージョン 1.X

バージョン1.Xの場合、コンパイル済みのクラス ファイルを確認したところ、実装が 2.X の場合と同じであると自信を持って言えます (以下のスニペット)。

@com.sun.javafx.runtime.annotation.Public
  public boolean equals(java.lang.Object arg0);
  4  invokestatic javafx.lang.Builtins.isSameObject(java.lang.Object, java.lang.Object) : boolean [87]
 15  instanceof javafx.scene.paint.Color [80]
 18  ifeq 121
 22  checkcast javafx.scene.paint.Color [80]
 28  invokevirtual javafx.scene.paint.Color.get$red() : float [45]
 38  invokevirtual javafx.scene.paint.Color.get$red() : float [45]
 50  invokevirtual javafx.scene.paint.Color.get$green() : float [47]
 60  invokevirtual javafx.scene.paint.Color.get$green() : float [47]
 72  invokevirtual javafx.scene.paint.Color.get$blue() : float [48]
 82  invokevirtual javafx.scene.paint.Color.get$blue() : float [48]
 94  invokevirtual javafx.scene.paint.Color.get$opacity() : float [49]
104  invokevirtual javafx.scene.paint.Color.get$opacity() : float [49]

equals()実装は1.X から 2.X まで変更されていません

あなたの本当の問題

Color1そしてColor2実際に typeの場合Color、それらを type のオブジェクトと比較していますString:

if(Color1.equals("yellow")) && (Color2.equals("yellow"))

比較はここで失敗します:

if (obj instanceof Color)

したがって、equals()メソッドは常に false を返します。equals()type の別のオブジェクトで使用する必要がありますColor

于 2013-03-18T12:36:58.007 に答える