使用JavaFX,如何将一个形状放在另一个上面?

时间:2014-08-24 01:55:23

标签: scala listview javafx

我正在尝试制作跳棋游戏。我将有64个矩形,一些矩形将在它们上面有圆圈(代表一个棋子片)。我该怎么做(即将一个形状放在另一个上面)?

如果重要的是我使用的是Scala,而不是Java(尽管语法类似,至少在项目的这一部分......)

2 个答案:

答案 0 :(得分:1)

将形状包裹在另一个节点中; StackPane看起来很理想。将其对齐方式设置为Pos. CENTER以获得所需的效果。

请记住,这不是一个完全有效的解决方案,因为您将创建64个StackPanes。如果你想避免这种情况,那么你需要做一些数学运算来手动将你的棋子放在所需的游戏棋盘位置之上。然而,这不应该是完全困难的,因为你知道你的棋盘方块,棋子的尺寸以及它们的布局方式。

答案 1 :(得分:1)

CAG Gonzo的答案将起作用,但也要注意,如果将多个节点放置在网格窗格中的同一单元格中,它们将相互叠加。这可能适用于您的应用程序:

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.RowConstraints;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class CheckerBoard extends Application {

    private static final int BOARD_SIZE = 8 ;
    private static final int SQUARE_SIZE= 40 ;
    private static final int NUM_PIECES = 12 ;

    @Override
    public void start(Stage primaryStage) {
        GridPane checkerBoard = new GridPane();

        configureBoardLayout(checkerBoard);

        addSquaresToBoard(checkerBoard);

        Circle[] whitePieces = new Circle[NUM_PIECES];
        Circle[] blackPieces = new Circle[NUM_PIECES];

        addPiecesToBoard(checkerBoard, whitePieces, blackPieces);

        BorderPane root = new BorderPane(checkerBoard);
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    private void addPiecesToBoard(GridPane checkerBoard, Circle[] whitePieces,
            Circle[] blackPieces) {
        for (int i=0; i<NUM_PIECES; i++) {
            whitePieces[i] = new Circle(SQUARE_SIZE/2-4, Color.WHITE);
            whitePieces[i].setStroke(Color.BLACK);
            checkerBoard.add(whitePieces[i], i%(BOARD_SIZE/2) * 2 + (2*i/BOARD_SIZE)%2, BOARD_SIZE - 1 - (i*2)/BOARD_SIZE);

            blackPieces[i] = new Circle(SQUARE_SIZE/2 -4, Color.BLACK);
            blackPieces[i].setStroke(Color.WHITE);
            checkerBoard.add(blackPieces[i], i%(BOARD_SIZE/2) * 2 + (1 + 2*i/BOARD_SIZE)%2, (i*2)/BOARD_SIZE);
        }
    }

    private void addSquaresToBoard(GridPane board) {
        Color[] squareColors = new Color[] {Color.WHITE, Color.BLACK};
        for (int row = 0; row < BOARD_SIZE; row++) {
            for (int col = 0; col < BOARD_SIZE; col++) {
                board.add(new Rectangle(SQUARE_SIZE, SQUARE_SIZE, squareColors[(row+col)%2]), col, row);
            }
        }
    }

    private void configureBoardLayout(GridPane board) {
        for (int i=0; i<BOARD_SIZE; i++) {
            RowConstraints rowConstraints = new RowConstraints();
            rowConstraints.setMinHeight(SQUARE_SIZE);
            rowConstraints.setPrefHeight(SQUARE_SIZE);
            rowConstraints.setMaxHeight(SQUARE_SIZE);
            rowConstraints.setValignment(VPos.CENTER);
            board.getRowConstraints().add(rowConstraints);

            ColumnConstraints colConstraints = new ColumnConstraints();
            colConstraints.setMinWidth(SQUARE_SIZE);
            colConstraints.setMaxWidth(SQUARE_SIZE);
            colConstraints.setPrefWidth(SQUARE_SIZE);
            colConstraints.setHalignment(HPos.CENTER);
            board.getColumnConstraints().add(colConstraints);
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
相关问题