首页 > 解决方案 > 如何获取高度和宽度滑块的值来调整由矩形(javaFx 和 sceneBuilder)组成的网格的大小?

问题描述

在此处输入图像描述我目前正在使用 JavaFX 和带有 eclipse 的场景构建器。如何获取高度和宽度滑块的值来调整由矩形组成的网格的大小?

这是我的代码的一部分: public class Controller {

@FXML private AnchorPane grid;
@FXML private Slider heightSlider;
@FXML private Slider widthSlider;
@FXML private Label heightLbl;
@FXML private Label widthLabel;
@FXML private Button robotBtn;

private int space = 1; // space between each rectangle

@FXML public void initialize(){ 

    heightSlider.valueProperty().addListener((observarable, oldValue, newValue) -> {
        heightLbl.setText(Double.toString(newValue.intValue()));;
    });
    widthSlider.valueProperty().addListener((observarable1, oldValue1, newValue1) -> {
        widthLabel.setText(Double.toString(newValue1.intValue()));;
    });



    heightSlider.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                    heightSlider.setValue((double) new_val);
            }
        });

    widthSlider.valueProperty().addListener(new ChangeListener<Number>() {
        public void changed(ObservableValue<? extends Number> ov,
                Number old_val, Number new_val) {
                    widthSlider.setValue((double) new_val);
            }
        });


    for(int i = 0; i < heightSlider.getValue(); i++) { // columns
        for(int j = 0; j < widthSlider.getValue(); j++) { // rows
            Rectangle rectangle = new Rectangle(space+i * 35, space+j*35, 35-2*space, 35-2*space);
            rectangle.setFill(Color.WHITE); // rectangle color
            rectangle.setStroke(Color.GREY); // outline color
            grid.getChildren().add(rectangle);
        }
    }
}

网格图像:

标签: javaeclipsejavafxsimulationscenebuilder

解决方案


这里的问题是没有获得滑块值。你这样做是正确的。查看您创建网格的方法:它被称为initialize!它只在启动时调用一次,因此网格只绘制一次。

当您在初始化后更改滑块的值时,不会使用新的宽度和高度值重新绘制网格。您需要创建一个使用新值执行此操作的方法。

以下是如何使用新值更新网格的示例:

@FXML private AnchorPane grid;
@FXML private Slider heightSlider;
@FXML private Slider widthSlider;
@FXML private Label heightLbl;
@FXML private Label widthLabel;
@FXML private Button robotBtn;

private int space = 1; // space between each rectangle
private ArrayList<Shape> shapes = new ArrayList<>(25); //Keeps track of the rectangles we currently have on-screen

@FXML public void initialize(){
        heightSlider.valueProperty().addListener((observarable, oldValue, newValue) -> {
            heightLbl.setText(Double.toString(heightSlider.getValue()));
            drawGrid(widthSlider.getValue(), heightSlider.getValue()); // Redraw the grid with the new dimensions
        });
        widthSlider.valueProperty().addListener((observarable1, oldValue1, newValue1) -> {
            widthLabel.setText(Double.toString(widthSlider.getValue()));
            drawGrid(widthSlider.getValue(), heightSlider.getValue()); // Redraw the grid with the new dimensions
        });
}

private void drawGrid(double width, double height){ // Draw grid with the provided dimensions
    if(shapes.size() > 0)
        grid.getChildren().removeAll(shapes);       // We must remove the previous rectangles, not just draw new ones (memory leak, performance)
    shapes.clear();
    for(int i = 0; i < (int) height; i++){ // columns
        for(int j = 0; j < (int) width; j++){ // rows
            Rectangle rectangle = new Rectangle(space+i*35, space+j*35, 35-2*space, 35-2*space);
            rectangle.setFill(Color.WHITE); // rectangle color
            rectangle.setStroke(Color.GREY); // outline color
            shapes.add(rectangle);
            grid.getChildren().add(rectangle);
        }
    }
}

推荐阅读