Javafx-バインディングボタンの無効状態に関する質問
-
05-10-2019 - |
質問
タスクのリストを維持するダミーアプリケーションを作成しようとしています。
今のところ、私がやろうとしているのはリストに追加することだけです。テキストボックスにタスク名を入力し、[タスクの追加]ボタンをクリックして、新しいアイテムとタスク名の入力がクリアされるとリストが更新されることを期待します。タスク名が空でない場合にのみタスクを追加できるようにしたいです。以下のコードは私の実装ですが、バインディングに関する質問があります。
テキストボックスのテキスト変数を自分のビューモデルの文字列にバインドしており、ボタンのボタンは私のビューモデルのブール値に変数を無効にします。
タスク名が変更されたときに、障害のある状態を更新するトリガーがあります。タスク名のバインディングが発生すると、それに応じてブール値が更新されますが、ボタンはまだ無効に見えます。しかし、ボタンの上にマウスをマウスすると、有効になります。これは、Javafx 1.3のバインディングが怠zyであることによるものだと思います。
また、タスクを追加したとき、モデルのタスク名をクリアしますが、テキストボックスのテキストは変更されません - 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
]
}
]
}
}
解決
記録のために、この質問は バインディングボタンの無効状態に関する質問 スレッド。
短い要約:Javafx 1.3にはバグがあります bind with inverse
オブジェクトのフィールドへ。回避策がありますが、カプセル化が壊れます。