2016-11-14 5 views
0

Я хочу сделать привязку, когда buttonA нажата (изменение значения от ложного к истине) lightIsTurnedOn превращает true (indepedend от стоимости buttonB), когда другой buttonB нажат (изменение значения от ложного к истине) lightIsTurnedOn включает false (независимо от значения кнопки А). Можно ли обрабатывать это с помощью связывания?Создание связывания с несколькими входами

private final BooleanBinding lightIsTurnedOn; 
private final BooleanProperty buttonA= new SimpleBooleanProperty(false); 
private final BooleanProperty buttonB = new SimpleBooleanProperty(false); 
+0

А затем на следующей прессе? что должно превратить это от истинного к ложному? Вам не нужны два переключателя? (Если один из них находится в положении «Вкл.», Индикатор горит, если оба из них «Выкл.», Свет выключен) – DVarga

ответ

0

Казалось бы, идеальная задача для ToggleButtons:

ToggleButton buttonA = new ToggleButton("A"); 
ToggleButton buttonB = new ToggleButton("B"); 

Label label = new Label(); 
label.textProperty().bind(buttonA.selectedProperty().or(buttonB.selectedProperty()).asString()); 

Текст Label изменится "true" всякий раз, когда по крайней мере один из ToggleButton с являются «включено» и изменится "false", если оба они «выключены».

0

Нет, это невозможно сделать с привязкой. Значение привязки вычисляется с помощью метода computeValue (по крайней мере, без хранения дополнительной информации). Этот метод не получает никаких параметров. Он просто не имеет никакой информации о том, какая зависимость была аннулирована последним.

Поэтому невозможно выделить следующие последовательности модификаций

buttonA pressed 
buttonB pressed 

и

buttonB pressed 
buttonA pressed 

Однако результаты lightIsTurnedOn быть false/true.


Однако, конечно, что-то, как это возможно, даже если просто добавить слушателей к свойствам, которые устанавливают значение было бы предпочтительнее.

@Override 
public void start(Stage primaryStage) { 
    ToggleButton buttonA = new ToggleButton("A"); 
    ToggleButton buttonB = new ToggleButton("B"); 
    Circle light = new Circle(30, Color.YELLOW); 
    light.visibleProperty().bind(new BooleanBinding() { 


     boolean lastA = false; 
     boolean lastB = false; 

     { 
      bind(buttonA.selectedProperty(), buttonB.selectedProperty()); 
     } 

     boolean value = false; 

     @Override 
     protected boolean computeValue() { 
      boolean a = buttonA.isSelected(); 
      boolean b = buttonB.isSelected(); 
      if (lastA != a && a) { 
       value = true; 
      } 

      if (lastB != b && b) { 
       value = false; 
      } 
      lastA = a; 
      lastB = b; 
      return value; 
     } 
    }); 

    HBox root = new HBox(buttonA, buttonB, light); 
    root.setAlignment(Pos.CENTER); 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
Смежные вопросы