如何获取高度和宽度滑块的值以调整由矩形(javaFx 和 sceneBuilder)组成的网格的大小?
How do I get the value of my height and width slider to adjust the size of a grid composed of rectangles ( javaFx and sceneBuilder)?
enter image description here我目前在 Eclipse 中使用 JavaFX 和场景生成器。如何获取我的高度和宽度滑块的值来调整由矩形组成的网格的大小?
这是我的代码部分:
public class 控制器 {
@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
!它只在启动时调用一次,因此网格只绘制一次。
当您在初始化后更改滑块的值时,不会使用新的宽度和高度重新绘制网格values.You需要创建一个使用新值执行此操作的方法。
以下是如何使用新值更新网格的示例:
@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);
}
}
}
enter image description here我目前在 Eclipse 中使用 JavaFX 和场景生成器。如何获取我的高度和宽度滑块的值来调整由矩形组成的网格的大小?
这是我的代码部分: public class 控制器 {
@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
!它只在启动时调用一次,因此网格只绘制一次。
当您在初始化后更改滑块的值时,不会使用新的宽度和高度重新绘制网格values.You需要创建一个使用新值执行此操作的方法。
以下是如何使用新值更新网格的示例:
@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);
}
}
}