更改滑块的数值
Change Numeric Value of a Slider
我正在编写一个带有两个滑块的程序,这些滑块的值显示在各自的标签(counter1 和 counter2)中。 Slider2 绑定到 slider1,但也可以独立移动。移动 slider1(结果是 slider2)后,我希望能够按下一个按钮来做两件事:
- 锁定slider1的值
- 更改 counter2 的值,使其从零开始计数,无论 slider2 在哪里(即 - 即使滑块可能位于 -10,counter2 显示为零。那么 -9 将是 1,-8 将是2 等)
这是我目前拥有的相关代码:
public CreateSliders() {
Slider slider1 = new Slider();
slider1.setMin(-30);
slider1.setMax(30);
slider1.setMinWidth(300);
slider1.setValue(0);
slider1.setShowTickLabels(true);
slider1.setShowTickMarks(true);
slider1.setMajorTickUnit(10);
slider1.setMinorTickCount(1);
slider1.setBlockIncrement(1);
Label counter1 = new Label(Double.toString(slider1.getValue()));
Button btn1 = new Button("Lock");
HBox counter1Hbox = new HBox(counter1, btn1);
counter1Hbox.setAlignment(Pos.CENTER);
btn1.setOnAction(new EventHandler<ActionEvent>() {
public void handle (ActionEvent event) {
counter2.setText("0.0");
}
});
Slider slider2 = new Slider();
slider2.setMin(-30);
slider2.setMax(30);
slider2.setMinWidth(300);
slider2.setValue(0);
slider2.setShowTickLabels(true);
slider2.setShowTickMarks(true);
slider2.setMajorTickUnit(10);
slider2.setMinorTickCount(1);
slider2.setBlockIncrement(1);
Label counter2 = new Label(Double.toString(slider2.getValue()));
HBox counter2Hbox = new HBox(counter2);
counter2Hbox.setAlignment(Pos.CENTER);
slider1.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
counter1.setText(String.format("%.0f", newValue));
slider2.valueProperty().set(slider2.valueProperty().get() + newValue.doubleValue() - oldValue.doubleValue());
}
});
slider2.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
counter2.setText(String.format("%.0f", newValue));
}
});
}
要锁定滑块位置,您可以使用:
ToggleButton btnLock = new ToggleButton("Lock");
btnLock.selectedProperty().addListener((ov, b, b1) ->
{
slider1.setMouseTransparent(b1));
//or
slider.setDisable(b1));
});
//or
slider1.disableProperty().bind(btnLock.selectedProperty());
对于第 2 点:
private double lastSliderPosition;
public void createSliders(){
//initialize sliders
ToggleButton btnLock = new ToggleButton("Lock");
btnLock.selectedProperty().addListener((ov, b, b1) -> {
slider1.setDisable(b1);
if (b1) {
slider2.valueProperty().unbind();
} else {
slider2.valueProperty().bind(slider1.valueProperty());
}
});
slider2.valueProperty().bind(slider1.valueProperty());
slider2.valueProperty().addListener((ov, t, t1) -> {
if (!slider2.isValueChanging()) {
lastSliderValue = (double) t1;
}
if (btnLock.isSelected()) {
counter2.setText(String.format("%.0f", t.doubleValue() - lastSliderValue));
} else {
counter2.setText(String.format("%.0f", t1));
}
});
}
我正在编写一个带有两个滑块的程序,这些滑块的值显示在各自的标签(counter1 和 counter2)中。 Slider2 绑定到 slider1,但也可以独立移动。移动 slider1(结果是 slider2)后,我希望能够按下一个按钮来做两件事:
- 锁定slider1的值
- 更改 counter2 的值,使其从零开始计数,无论 slider2 在哪里(即 - 即使滑块可能位于 -10,counter2 显示为零。那么 -9 将是 1,-8 将是2 等)
这是我目前拥有的相关代码:
public CreateSliders() {
Slider slider1 = new Slider();
slider1.setMin(-30);
slider1.setMax(30);
slider1.setMinWidth(300);
slider1.setValue(0);
slider1.setShowTickLabels(true);
slider1.setShowTickMarks(true);
slider1.setMajorTickUnit(10);
slider1.setMinorTickCount(1);
slider1.setBlockIncrement(1);
Label counter1 = new Label(Double.toString(slider1.getValue()));
Button btn1 = new Button("Lock");
HBox counter1Hbox = new HBox(counter1, btn1);
counter1Hbox.setAlignment(Pos.CENTER);
btn1.setOnAction(new EventHandler<ActionEvent>() {
public void handle (ActionEvent event) {
counter2.setText("0.0");
}
});
Slider slider2 = new Slider();
slider2.setMin(-30);
slider2.setMax(30);
slider2.setMinWidth(300);
slider2.setValue(0);
slider2.setShowTickLabels(true);
slider2.setShowTickMarks(true);
slider2.setMajorTickUnit(10);
slider2.setMinorTickCount(1);
slider2.setBlockIncrement(1);
Label counter2 = new Label(Double.toString(slider2.getValue()));
HBox counter2Hbox = new HBox(counter2);
counter2Hbox.setAlignment(Pos.CENTER);
slider1.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
counter1.setText(String.format("%.0f", newValue));
slider2.valueProperty().set(slider2.valueProperty().get() + newValue.doubleValue() - oldValue.doubleValue());
}
});
slider2.valueProperty().addListener(new ChangeListener<Number>() {
public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
counter2.setText(String.format("%.0f", newValue));
}
});
}
要锁定滑块位置,您可以使用:
ToggleButton btnLock = new ToggleButton("Lock");
btnLock.selectedProperty().addListener((ov, b, b1) ->
{
slider1.setMouseTransparent(b1));
//or
slider.setDisable(b1));
});
//or
slider1.disableProperty().bind(btnLock.selectedProperty());
对于第 2 点:
private double lastSliderPosition;
public void createSliders(){
//initialize sliders
ToggleButton btnLock = new ToggleButton("Lock");
btnLock.selectedProperty().addListener((ov, b, b1) -> {
slider1.setDisable(b1);
if (b1) {
slider2.valueProperty().unbind();
} else {
slider2.valueProperty().bind(slider1.valueProperty());
}
});
slider2.valueProperty().bind(slider1.valueProperty());
slider2.valueProperty().addListener((ov, t, t1) -> {
if (!slider2.isValueChanging()) {
lastSliderValue = (double) t1;
}
if (btnLock.isSelected()) {
counter2.setText(String.format("%.0f", t.doubleValue() - lastSliderValue));
} else {
counter2.setText(String.format("%.0f", t1));
}
});
}