JavaFX - вопрос относительно отключенного состояния кнопки привязки - PullRequest
0 голосов
/ 27 мая 2010

Я пытаюсь создать фиктивное приложение, которое поддерживает список задач.

Пока все, что я пытаюсь сделать, это добавить в список. Я ввожу имя задачи в текстовое поле, нажимаю кнопку «Добавить задачу» и ожидаю, что список будет обновлен новым элементом, а ввод имени задачи будет очищен. Я хочу иметь возможность добавлять задачи, только если имя задачи не пустое. Приведенный ниже код является моей реализацией, но у меня есть вопрос относительно привязки.

Я связываю текстовую переменную текстового поля со строкой в ​​моей модели представления, а переменную отключения кнопки с логическим значением в моей модели представления.

У меня есть триггер для обновления отключенного состояния при изменении имени задачи. Когда происходит привязка имени задачи, логическое значение обновляется соответствующим образом, но кнопка по-прежнему кажется отключенной. Но затем, когда я наводю курсор мыши на кнопку, она становится активной. Я полагаю, что это связано с тем, что привязка 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
                ]
            }
        ]
    }
}

1 Ответ

1 голос
/ 07 июня 2010

Кстати, на этот вопрос ответили в вопросе о отключенном состоянии кнопки привязки нить.

Краткое резюме: в JavaFX 1.3 есть ошибка для bind with inverse полей в объектах. Существует обходной путь, но он нарушает инкапсуляцию.

...