2010-05-27 44 views
0

我試圖創建一個虛擬應用程序來維護任務列表。JavaFX - 有關綁定按鈕的禁用狀態的問題

現在,我正在嘗試添加到列表中。我在文本框中輸入任務名稱,單擊添加任務按鈕,並期望列表中的新項目和要清除的任務名稱輸入被更新。我只想在任務名稱不爲空的情況下添加任務。下面的代碼是我的實現,但我有一個關於綁定的問題。

我將文本框的文本變量綁定到我的視圖模型中的字符串,並將按鈕的禁用變量綁定到我的視圖模型中的布爾值。

我有一個觸發器來更新任務名稱更改時的禁用狀態。當任務名稱的綁定發生時,布爾值會相應更新,但該按鈕仍然顯示爲禁用。但是,當我將鼠標放在按鈕上時,它變爲啓用。我相信這是由於JavaFX 1.3的綁定是懶惰的 - 只有在讀取綁定變量時才更新綁定變量。

此外,當我添加任務時,我清除模型中的任務名稱,但文本框的文本不會更改 - 即使我正在使用bind with inverse

有沒有辦法通過綁定來自動更新文本框的文本和按鈕的禁用狀態?

感謝,

詹姆斯

AddTaskViewModel.fx:

package jamiebarrow; 

import java.lang.System; 

public class AddTaskViewModel { 

function logChange(prop:String,oldValue,newValue):Void { 
    println("{System.currentTimeMillis()} : {prop} [{oldValue}] to [{newValue}] "); 
} 


    public var newTaskName: String on replace old { 
     logChange("newTaskName",old,newTaskName); 
     isAddTaskDisabled = (newTaskName == null or newTaskName.trim().length() == 0); 
    }; 
    public var isAddTaskDisabled: Boolean on replace old { 
     logChange("isAddTaskDisabled",old,isAddTaskDisabled); 
    }; 
    public var taskItems = [] on replace old { 
     logChange("taskItems",old,taskItems); 
    }; 

    public function addTask() { 
     insert newTaskName into taskItems; 
     newTaskName = ""; 
    } 

} 

Main.fx:

package jamiebarrow; 

import javafx.scene.control.Button; 
import javafx.scene.control.TextBox; 
import javafx.scene.control.ListView; 
import javafx.scene.Scene; 
import javafx.scene.layout.VBox; 
import javafx.stage.Stage; 
import javafx.scene.layout.HBox; 

def viewModel = AddTaskViewModel{}; 

var txtName: TextBox = TextBox { 
      text: bind viewModel.newTaskName with inverse 
      onKeyTyped: onKeyTyped 
     }; 

function onKeyTyped(event): Void { 
    txtName.commit(); // ensures model is updated 
    cmdAddTask.disable = viewModel.isAddTaskDisabled;// the binding only occurs lazily, so this is needed 
} 

var cmdAddTask = Button { 
      text: "Add" 
      disable: bind viewModel.isAddTaskDisabled with inverse 
      action: onAddTask 
     }; 

function onAddTask(): Void { 
    viewModel.addTask(); 
} 

var lstTasks = ListView { 
      items: bind viewModel.taskItems with inverse 
     }; 

Stage { 
    scene: Scene { 
     content: [ 
      VBox { 
       content: [ 
        HBox { 
         content: [ 
          txtName, 
          cmdAddTask 
         ] 
        }, 
        lstTasks 
       ] 
      } 
     ] 
    } 
} 
+0

注意:onKeyTyped方法用於確保文本框在用戶輸入時更新模型,而不是在失去焦點時更新模型,並且更新cmdAddButton狀態。 – jamiebarrow 2010-05-27 07:51:49

回答

1

爲了記錄在案,這個問題已經回答question regarding binding button’s disabled state線程。

簡短摘要:在對象中的字段中,JavaFX 1.3中存在bind with inverse的錯誤。有一個解決方法,但它打破封裝。

+0

再次感謝PhiLho。實際上沒有實施變化,但看起來不錯,所以現在信任它:)當我有機會時會再次檢查。 – jamiebarrow 2010-06-07 10:40:04