2016-12-21 55 views
0

我有這樣的代碼在同一對象上的事件:JavaFX的複選框處理產生它

CheckBox checkboxFrame1; 

    checkboxFrame1.setOnMousePressed(new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent event) { 
      CheckBox chk = (CheckBox) event.getSource(); 
      if (!chk.isSelected()) 
      { 
       if (makeNotSelected()) { 
        chk.setSelected(false); 
       } 
      } 
     } 

    }); 

或另一個版本:

checkboxFrame1.selectedProperty().addListener(new ChangeListener<Boolean>() { 
     @Override 
     public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
      if (makeNotSelected()) { 
        checkboxFrame1.setSelected(false); 
      } 
     } 
    }); 

這兩個代碼不工作。我認爲他們不能避免競爭條件。

如何使用更改對象狀態(選中與否)的事件 - 複選框 - 導致它的事件?

我的目標是通過使用makeNotSelected()方法進行測試,將剛選中的複選框置於非選中狀態。

+0

有沒有競爭條件在這裏,因爲一切都是在只有一個線程發生。第一個代碼塊不可能做任何有效的事情,因爲你唯一執行的事情是'chk.setSelected(false)',而且只有當'chk'已被取消選擇時纔會這樣做。 'makeNotSelected()'中的邏輯是什麼?你究竟在做什麼?第二個代碼塊會發生什麼? –

+0

如果我沒有弄錯,你想在檢查時改變你的複選框的狀態嗎? –

+0

@James_D我想在選擇時改變複選框的狀態,並根據makeNotSelected()返回的值將它置於未選中狀態。 – famedoro

回答

0

我一直在使用這樣的代碼解析:

checkboxFrame1.selectedProperty().addListener(new ChangeListener<Boolean>() { 
    @Override 
    public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) { 
     if ((makeNotSelected())&&(checkboxFrame1.isSelected())) { 
       checkboxFrame1.setDisable(true); 
       checkboxFrame1.setSelected(false); 
       checkboxFrame1.setDisable(false); 
     } 
    } 
});