1

私はJavaFXの使用についてもっと学びたいと思っていました.このプログラムでは、すでにプレイされた3×3の三目並べのゲームを表示しようとしています. ImageViews を作成し、使用する画像を設定しましたが、それらを列と行に挿入し始めると、同じものを 2 回使用できないことに気付きました。空のスペース、X、および O のイメージがあります。1 つ以上使用すると、「アプリケーションの実行中に例外」が発生します。初心者の間違いかもしれませんが、説明をいただければ幸いです。

package Fresh;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class Fresh extends Application {

    @Override
    public void start(Stage primaryStage) {
       //Create a pane and set its properties
        GridPane pane = new GridPane();
        pane.setAlignment(Pos.CENTER);
        pane.setPadding(new Insets(11.5, 12.5, 13.5, 14.5));
        pane.setHgap(5.5);
        pane.setVgap(5.5);

        //imv0 = X image
        final ImageView imv0 = new ImageView();
        final Image image0 = new Image(Fresh.class.getResourceAsStream("images/x.gif"));
        imv0.setImage(image0);

        //imv1 = O image
        final ImageView imv1 = new ImageView();
        final Image image1 = new Image(Fresh.class.getResourceAsStream("images/o.gif"));
        imv1.setImage(image1);

        //imv2 = empty image
        final ImageView imv2 = new ImageView();
        final Image image2 = new Image(Fresh.class.getResourceAsStream("images/empty.gif"));
        imv2.setImage(image2);

        //Place nodes in the pane
        pane.add((imv0),0,0);
        pane.add((imv1), 1, 0);

//Once I try to use imv0 again "I get an exception while running". 
        pane.add((imv0),0,1);

        //Create a scene and place it in the stage
        Scene scene = new Scene(pane);
        primaryStage.setTitle("ShowGridPane");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

}
4

1 に答える 1

3

同じImageものを何度でも使用できます。ImageViewただし、特定の をシーン グラフ内の 1 か所にしか配置できません。Javadocから:

ノードは、シーン グラフの任意の場所で最大 1 回発生する可能性があります。

これが真実でなければならない理由を理解するために、あなたは何を期待しますか

GridPane.getColumnIndex(imv0)

あなたが持っているコードを考えると、戻るには?

したがって、次のことができます。

final Image image0 = new Image(Fresh.class.getResourceAsStream("images/x.gif"));
ImageView imv00 = new ImageView(image0);
ImageView imv01 = new ImageView(image0);

pane.add(imv00, 0, 0);
pane.add(imv01, 0, 1);

// etc

ここでのオーバーヘッドはそれほど悪くありません。それぞれに同じ画像データを使用しますImageView

于 2015-04-05T23:04:34.587 に答える