java - 如何获取高度和宽度滑块的值来调整由矩形(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);
}
}
}
网格图像:
解决方案
这里的问题是没有获得滑块值。你这样做是正确的。查看您创建网格的方法:它被称为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);
}
}
}