Как получить значение моего ползунка высоты и ширины, чтобы настроить размер сетки, состоящей из прямоугольников (javaFx и sceneBuilder)? - PullRequest
0 голосов
/ 26 апреля 2018

введите описание изображения здесь В настоящее время я использую JavaFX и конструктор сцен с затмением.Как мне получить значение моего ползунка высоты и ширины, чтобы настроить размер сетки, состоящей из прямоугольников?

вот часть моего кода: 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);
        }
    }
}

Изображение сетки:

1 Ответ

0 голосов
/ 26 апреля 2018

Проблема здесь не в получении значения ползунка.Вы делаете это правильно.Посмотрите на метод, в котором вы создаете сетку: он называется 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);
        }
    }
}
...