【问题标题】:JavaFX - Using for loops in GridPane?JavaFX - 在 GridPane 中使用 for 循环?
【发布时间】:2014-12-07 01:22:37
【问题描述】:

我正在尝试使用两个 for 循环来自动将 ImageView 节点添加到每个位置。使用 for 循环时,我收到一个错误。当我只用一条语句将 for 循环代码注释掉以添加 ImageView 节点时,代码似乎可以工作,您可以使用 for 循环来填充 GridPane 吗?如果是这样,我做错了什么?如果不是,可以使用什么作为解决方案?

我的班级:

import javafx.application.Application;
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 GridCreation extends Application {
@Override
public void start(Stage gameStage) throws Exception {
    GridPane grid = new GridPane();
    Image backOfCardsImg = new Image("images/naruto_shipuden_logo.png");
    ImageView backOfCards = new ImageView(backOfCardsImg);
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                grid.add(backOfCards, i, j);

            }
        }

    //grid.add(backOfCards, 1,1);
    Scene scene = new Scene(grid);
    gameStage.setTitle("MemoryGame");
    gameStage.setScene(scene);
    gameStage.show();
}

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

编辑:代码:

grid.add(backOfCards, i, j);

我将代码行改为

grid.add(new ImageView(backOfCardImg), i, j);

这似乎解决了问题,但谁能向我解释为什么第一个选项不起作用?

【问题讨论】:

  • ImageView 是一个Node,你不能重复使用它,否则你会得到这个异常:Children: duplicate children added。第二种解决方案有效,因为您为网格上的每个单元格创建一个新的图像视图。
  • 我想重用图像并将其添加到每个 gridPane 是他们对此的任何解决方案吗?
  • 由于 FX 节点只能在父节点上,并且只允许添加到该父节点一次,因此每次要在网格中显示该图像时,您都必须创建一个新的 ImageView()。它不会复制 eimage 本身,只会复制视图的 JavaFX 容器/控件。

标签: java for-loop javafx gridpane


【解决方案1】:

这对于 fx 中的记忆游戏来说可能是一个有用的开始。它使用自己的 ImageView 扩展来执行转弯和聚焦动画并处理常见的背面图像。它只有图形,没有游戏逻辑。

public class MemoryGame extends Application {
    final int rows = 4;
    final int columns = 4;
    CardView views[][] = new CardView[rows][];

    public static class CardView extends ImageView {
        static final double scale = 0.95;
        static DropShadow shadowhoover = new DropShadow(5, 4, 4, Color.rgb(50, 60, 50));
        static DropShadow shadowdown = new DropShadow(2, 2, 2, Color.rgb(50, 60, 50));
        static Image backside = null;
        public static void setbackside(Image image) { backside = image; }

        public CardView(Image image) { 
            super(backside); 
            setRotationAxis(new Point3D(0, 200,0));
            setScaleX(scale);
            setScaleY(scale);
            setEffect(shadowdown);
            setOnMouseEntered(m -> {
                setEffect(shadowhoover);
                setScaleX(scale*1.01);
                setScaleY(scale*1.01);
            });
            setOnMouseExited(m -> {
                setEffect(shadowdown);
                setScaleX(scale);
                setScaleY(scale);
            });
            setOnMouseClicked(m -> {      
                RotateTransition r1 = new RotateTransition(Duration.millis(300), this);
                r1.setByAngle(90);
                r1.setOnFinished(e -> setImage(image));
                RotateTransition r2 = new RotateTransition(Duration.millis(300), this);
                r2.setByAngle(-90);

                RotateTransition r3 = new RotateTransition(Duration.millis(300), this);
                r3.setByAngle(90);
                r3.setOnFinished(e -> setImage(backside));
                RotateTransition r4 = new RotateTransition(Duration.millis(300), this);
                r4.setByAngle(-90);

                new SequentialTransition(r1, r2, new PauseTransition(Duration.millis(1000)), r3, r4).play();
            });
        }
    }

    @Override
    public void start(Stage gameStage) throws Exception {
        GridPane grid = new GridPane();
        grid.setBackground(new Background(new BackgroundFill(Color.rgb(140, 200, 140), new CornerRadii(0), new Insets(0))));
        grid.setHgap(5);
        grid.setVgap(5);
        Image back = new Image(MemoryGame.class.getResource("card-back.png").toExternalForm(), 140, 200, true, true);
        Image front = new Image(MemoryGame.class.getResource("card-1.png").toExternalForm(), 140, 200, true, true);
        CardView.setbackside(back);
        for (int r = 0; r < rows; r++) {
            views[r] = new CardView[columns];
            for (int c = 0; c < columns; c++) {
                CardView view = new CardView(front); // different front images of course...
                views[r][c] = view;

                HBox box = new HBox(5);
                box.getChildren().add(views[r][c]);
                grid.add(box, c, r);

            }
        }

        //grid.add(backOfCards, 1,1);
        Scene scene = new Scene(grid);
        gameStage.setTitle("MemoryGame");
        gameStage.setScene(scene);
        gameStage.show();
    }

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-17
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    相关资源
    最近更新 更多