2016-01-01 5 views
2

У меня есть модель с булевым свойством, которое можно переключить. Однако в зависимости от условий переключение свойств может завершиться неудачей.Флажок JavaFX не соответствует значению связанного свойства

Я хочу привязать это свойство к флажку в моем пользовательском интерфейсе, кроме того, если свойство не переключается, я хочу, чтобы флажок оставался в прежнем состоянии.

Я создал SSCCE для данного ниже. У меня есть логическое свойство, которое эмулирует неудачный переход из false в true, просто устанавливая значение false вне зависимости от аргумента. Флажок изначально имеет значение false, также как и логическое свойство.

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

Есть ли что-то, что я могу сделать с этим в свойствах boolean, или мне нужно обойти это, не привязывая свойство вообще и использовать прослушиватели и обработчики событий?

SSCCE:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.scene.Scene; 
import javafx.scene.control.CheckBox; 
import javafx.stage.Stage; 

public class PropertySSCCE extends Application { 

    BooleanProperty property = new SimpleBooleanProperty(false) { 
     @Override 
     public void set(boolean newValue) { 
      super.set(false); 
      fireValueChangedEvent(); 
     } 

     @Override 
     public void setValue(Boolean v) { 
      super.setValue(false); 
      fireValueChangedEvent(); 
     } 
    }; 

    @Override 
    public void start(Stage aStage) throws Exception { 
     CheckBox cb = new CheckBox(); 
     cb.selectedProperty().bindBidirectional(property); 

     Scene scene = new Scene(cb); 
     aStage.setScene(scene); 
     aStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(); 
    } 
} 
+0

Глядя на код 'bindBidirectional', когда одно значение изменяет "обновление" установлен флаг, так что вы не получите цикл обновления. Вот почему он не работает. Я не знаю лучшего решения, чем пользовательские слушатели. источник: http://grepcode.com/file/repo1.maven.org/maven2/net.java.openjfx.backport/openjfx-78-backport/1.8.0-ea-b96.1/com/sun/ JavaFX/связывания/BidirectionalBinding.java # BidirectionalBinding.BidirectionalBooleanBinding – Itai

ответ

0

В соответствии с @ sillyfly замечании это, кажется, невозможно с привязкой, поэтому я создал следующий помощник для связывания CheckBox «s отображается значение логического свойства и (аb) используется Predicate, чтобы установить и указать, была ли настройка в порядке.

public static void bindTogglable(CheckBox aCheckBox, BooleanExpression aBooleanExpression, 
     Predicate<Boolean> aSuccess) { 
    aCheckBox.setSelected(aBooleanExpression.get()); 
    aBooleanExpression.addListener((aObservable, aOld, aNew) -> { 
     aCheckBox.setSelected(aNew); 
    }); 

    aCheckBox.setOnAction(e -> { 
     boolean value = aCheckBox.isSelected(); 
     boolean oldValue = aBooleanExpression.get(); 
     if (value != oldValue && !aSuccess.test(value)) { 
      aCheckBox.setSelected(oldValue); 
     } 
    }); 
} 

Для SSCCE OP проку будет выглядеть следующим образом:

bindTogglable(cb, property, (value) -> false); 

вместо:

cb.selectedProperty().bindBidirectional(property); 
Смежные вопросы