2016-11-14 110 views
0

綁定我想要做一個綁定,當按下buttonA(改變值從假到真)lightIsTurnedOn變成true,當另一個buttonB按下(從假到真變化值(buttonB的價值indepedend) )lightIsTurnedOnfalse(buttonA的值的獨立)。 是否有可能通過綁定來處理?創建多個輸入

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 S的至少一個是「接通」,將改變如果兩者都「關閉」,則爲"false"

0

沒有這是不可能的綁定。綁定的值由computeValue方法計算(至少在不存儲其他信息的地方)。此方法不會獲得任何參數。它根本沒有關於哪個依賴項最後失效的任何信息。

因此它不可能區分修改

buttonA pressed 
buttonB pressed 

buttonB pressed 
buttonA pressed 

的以下序列然而結果是lightIsTurnedOnfalse/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(); 
}