2016-10-12 2 views
0

안녕 난 상황에서 붙어있어 작업은 다음과 같습니다 거기에 그들 각각의 최대 값 100 을 가지고 2 개 슬라이더입니다 그러나이 값이 2 개 슬라이더 사이에 나누어 져 있습니다, 예를 들어 첫 번째 슬라이더를 값 20으로 이동하면 두 번째 슬라이더 값은 80이어야하고 그 반대의 경우도 마찬가지입니다.슬라이더 bindBidirectional

이 방법은 바인딩 양방향으로 수행해야하지만 어떻게 속성에 바인딩 할 수 있습니까?

slider1.valueProperty().bindBidirectional(slider2.getMax() - slider2.valueProperty()); ??? 

도움이 될 것입니다.

답변

2

당신은 양방향 바인딩이 작업을 수행 할 수 없습니다

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); 
    } 
} 
+0

이것을 받았습니다. 고마워 James_D. – orioncs

+0

@orioncs 여러분, 천만입니다. 그러나 업데이 트를 확인하십시오. –