Java 自动调整大小的棋盘

Java 自动调整大小的棋盘,java,layout,resize,javafx,Java,Layout,Resize,Javafx,所以,我试图用javaFX显示一个棋盘。我将不得不执行不同的操作并绘制一些瓷砖,因此我选择为每个瓷砖使用画布,并使用网格窗格以网格方式为我排列它们。 不幸的是,我在调整网格分幅的大小时遇到了一些问题;我希望我的整个棋盘能够根据场景自动调整大小。因此,我在GridPane的高度和宽度属性中添加了一个ChangeListener,它负责调整平铺的大小。这只在窗口变大时有效,当窗口缩小到更小时,所有的东西都会变大 下面是我提出的最短的问题: package chessboardtest; impor

所以,我试图用javaFX显示一个棋盘。我将不得不执行不同的操作并绘制一些瓷砖,因此我选择为每个瓷砖使用画布,并使用网格窗格以网格方式为我排列它们。
不幸的是,我在调整网格分幅的大小时遇到了一些问题;我希望我的整个棋盘能够根据场景自动调整大小。因此,我在GridPane的高度和宽度属性中添加了一个ChangeListener,它负责调整平铺的大小。这只在窗口变大时有效,当窗口缩小到更小时,所有的东西都会变大
下面是我提出的最短的问题:

package chessboardtest;

import javafx.application.Application;
import javafx.beans.value.*;
import javafx.geometry.*;
import javafx.scene.*;
import javafx.scene.canvas.*;
import javafx.scene.control.*;
import javafx.scene.layout.*;
import javafx.scene.paint.*;
import javafx.stage.Stage;

public class ChessboardTest extends Application {

    final int size = 10;

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();

        final GridPane chessboard = new GridPane();
        fillChessboard(chessboard, size);

        ChangeListener<Number> resizeListener = new ChangeListener<Number>() {

            @Override
            public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
                double newWidth = chessboard.getWidth() / size;
                double newHeight = chessboard.getHeight() / size;

                for(Node n: chessboard.getChildren()) {
                    Canvas canvas = (Canvas)n;
                    canvas.setWidth(newWidth);
                    canvas.setHeight(newHeight);
                }
            }
        };

        chessboard.widthProperty().addListener(resizeListener);
        chessboard.heightProperty().addListener(resizeListener);

        root.getChildren().add(chessboard);
        root.setPadding(new Insets(10));
        VBox.setVgrow(chessboard, Priority.ALWAYS);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("chessboard");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    void fillChessboard(GridPane pane, int size) {
        class RedrawListener implements ChangeListener<Number> {
            Color color;
            Canvas canvas;
            public RedrawListener(Canvas c, int i) {
                if(i % 2 == 0) {
                    color = Color.BLACK;
                }
                else {
                    color = Color.WHITE;
                }
                canvas = c;
            }

            @Override
            public void changed(ObservableValue<? extends Number> ov, Number t, Number t1) {
                canvas.getGraphicsContext2D().setFill(color);
                canvas.getGraphicsContext2D().fillRect(0, 0, canvas.getWidth(), canvas.getHeight());
            }
        }

        for(int row = 0; row < size; row++) {
            for(int col = 0, i = row; col < size; col++, i++) {
                Canvas c = new Canvas();
                RedrawListener rl = new RedrawListener(c, i);
                c.widthProperty().addListener(rl);
                c.heightProperty().addListener(rl);

                pane.add(c, row, col);
            }
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}
包装棋盘测试;
导入javafx.application.application;
导入javafx.beans.value.*;
导入javafx.geometry.*;
导入javafx.scene.*;
导入javafx.scene.canvas.*;
导入javafx.scene.control.*;
导入javafx.scene.layout.*;
导入javafx.scene.paint.*;
导入javafx.stage.stage;
公共类棋盘测试扩展应用{
最终整数大小=10;
@凌驾
公共无效开始(阶段primaryStage){
VBox root=新的VBox();
最终网格窗格棋盘=新网格窗格();
填充棋盘(棋盘,大小);
ChangeListener resizeListener=新的ChangeListener(){
@凌驾

public void已更改(observeValue如果您不需要画布(而且您可能不需要),只需使用
StackPane
s来填充正方形的宽度和高度。您始终可以向
StackPane
s添加画布(或任何其他内容)以显示其内容

import javafx.application.Application;
import javafx.geometry.HPos;
import javafx.geometry.VPos;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Chessboard extends Application {

    @Override
    public void start(Stage primaryStage) {
        GridPane root = new GridPane();
        final int size = 8 ;
        for (int row = 0; row < size; row++) {
            for (int col = 0; col < size; col ++) {
                StackPane square = new StackPane();
                String color ;
                if ((row + col) % 2 == 0) {
                    color = "white";
                } else {
                    color = "black";
                }
                square.setStyle("-fx-background-color: "+color+";");
                root.add(square, col, row);
            }
        }
        for (int i = 0; i < size; i++) {
            root.getColumnConstraints().add(new ColumnConstraints(5, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, HPos.CENTER, true));
            root.getRowConstraints().add(new RowConstraints(5, Control.USE_COMPUTED_SIZE, Double.POSITIVE_INFINITY, Priority.ALWAYS, VPos.CENTER, true));
        }
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
导入javafx.application.application;
导入javafx.geometry.HPos;
导入javafx.geometry.VPos;
导入javafx.scene.scene;
导入javafx.scene.control.control;
导入javafx.scene.layout.ColumnConstraints;
导入javafx.scene.layout.GridPane;
导入javafx.scene.layout.Priority;
导入javafx.scene.layout.RowConstraints;
导入javafx.scene.layout.StackPane;
导入javafx.stage.stage;
公共类棋盘扩展应用{
@凌驾
公共无效开始(阶段primaryStage){
GridPane root=新的GridPane();
最终整数大小=8;
对于(int row=0;row
这是一个很好的解决方案,但是在Java FX中使用数据绑定可以更轻松地调整大小。您可以通过这种方式隐藏所有侦听器业务。 这是一个很像James D的解决方案,但使用矩形来读取画布中的正方形:

public class ResizeChessboard extends Application {
    GridPane root = new GridPane();
    final int size = 8;

    public void start(Stage primaryStage) {
        for (int row = 0; row < size; row++) {
            for (int col = 0; col < size; col++) {
                Rectangle square = new Rectangle();
                Color color;
                if ((row + col) % 2 == 0) color = Color.WHITE;
                else color = Color.BLACK;
                square.setFill(color);
                root.add(square, col, row);
                square.widthProperty().bind(root.widthProperty().divide(size));
                square.heightProperty().bind(root.heightProperty().divide(size));
            }
        }
        primaryStage.setScene(new Scene(root, 400, 400));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
public类ResizeChessboard扩展应用程序{
GridPane root=新的GridPane();
最终整数大小=8;
公共无效开始(阶段primaryStage){
对于(int row=0;row
你真的需要画布吗?你能不能用一个类似于堆叠窗格的东西来画正方形?谢谢,我也喜欢你的解决方案!