당신은 양방향 바인딩이 작업을 수행 할 수 없습니다
이
slider1.valueProperty().addListener((obs, oldValue, newValue) ->
slider2.setValue(slider2.getMax() - newValue.doubleValue()));
slider2.valueProperty().addListener((obs, oldValue, newValue) ->
slider1.setValue(slider1.getMax() - newValue.doubleValue()));
SSCCE가 : 당신이 두 개의 리스너 사용할 필요가
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ConverselyBoundSliders extends Application {
@Override
public void start(Stage primaryStage) {
Slider slider1 = new Slider(0, 100, 50);
Slider slider2 = new Slider(0, 100, 50);
slider1.valueProperty().addListener((obs, oldValue, newValue) ->
slider2.setValue(slider2.getMax() - newValue.doubleValue()));
slider2.valueProperty().addListener((obs, oldValue, newValue) ->
slider1.setValue(slider1.getMax() - newValue.doubleValue()));
VBox root = new VBox(5, slider1, slider2);
root.setPadding(new Insets(12));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
이 발생하는 어떤 무한 재귀없이 잘 작동하는 것 같다을; 그러나 부동 소수점 산술과 이에 대한 비교가 포함되어 있기 때문에 slider.getMax() - newValue.doubleValue()
계산의 반올림 오류가 재귀에서 벗어나지 않고 다른 호출자를 호출하는 각 수신기로 끝나지 않도록 할 수 있습니다. 다음은 그것을하기위한 방탄 방법입니다 :
import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ConverselyBoundSliders extends Application {
@Override
public void start(Stage primaryStage) {
Slider slider1 = new Slider(0, 100, 50);
Slider slider2 = new Slider(0, 100, 50);
new ConverseSliderBinding(slider1, slider2);
VBox root = new VBox(5, slider1, slider2);
root.setPadding(new Insets(12));
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
private static class ConverseSliderBinding {
private ChangeListener<Number> listener1 ;
private ChangeListener<Number> listener2 ;
private final Slider slider1 ;
private final Slider slider2 ;
private boolean adjusting ;
public ConverseSliderBinding(Slider slider1, Slider slider2) {
this.slider1 = slider1 ;
this.slider2 = slider2 ;
listener1 = (obs, oldValue, newValue) -> {
if (adjusting) return ;
adjusting = true ;
slider2.setValue(slider2.getMax() - newValue.doubleValue());
adjusting = false ;
};
listener2 = (obs, oldValue, newValue) -> {
if (adjusting) return ;
adjusting = true ;
slider1.setValue(slider1.getMax() - newValue.doubleValue());
adjusting = false ;
};
slider1.valueProperty().addListener(listener1);
slider2.valueProperty().addListener(listener2);
}
public void dispose() {
slider1.valueProperty().removeListener(listener1);
slider2.valueProperty().removeListener(listener2);
}
}
public static void main(String[] args) {
launch(args);
}
}
이것을 받았습니다. 고마워 James_D. – orioncs
@orioncs 여러분, 천만입니다. 그러나 업데이 트를 확인하십시오. –