首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >管理任务的等待游标

管理任务的等待游标
EN

Stack Overflow用户
提问于 2015-06-03 09:48:40
回答 1查看 774关注 0票数 0
  1. 我在UI之外,希望在事情发生时显示一个等待游标,并使用以下基本模式: on UI - primaryStage.scene.cursor = Cursor.WAIT try { do stuff off UI... } finally { on UI - primaryStage.scene.cursor = Cursor.DEFAULT }

在运行过程中,我可以启动另一个进程,它可以快速完成,并在第一个任务完成之前恢复游标。

我不介意在第一个任务完成时“等待”,但我不认为这意味着在UI线程上执行工作?javafx中提供的这种模式有内置的解决方案吗?

  1. 我的标签包含2个组合框。当我点击第二个组合框下拉时,在列表上有时会出现一个等待光标,即使光标目前是默认状态。如果我将鼠标指针移出/移回列表中,则光标将正确显示为默认值。这是一个单独的问题,还是某种程度上是相关的?

视图

代码语言:javascript
复制
label 'From'
comboBox(items: bind(model.wcomboFromItemsProperty()), value: bind(model.wcomboFromProperty()), selectFromAction)
label 'To'
comboBox(items: bind(model.wcomboFromItemsProperty()), value: bind(model.wcomboToProperty()), selectToAction)

模型

代码语言:javascript
复制
@FXObservable ListElement wcomboFrom = new ListElement()
@FXObservable ListElement wcomboTo = new ListElement()
@FXObservable List wcomboFromItems = FXCollections.observableArrayList()
@FXObservable List wcomboToItems = FXCollections.observableArrayList()

final ObjectProperty<Cursor> CURSOR_DEFAULT = new SimpleObjectProperty<>(Cursor.DEFAULT)
final ObjectProperty<Cursor> CURSOR_WAIT = new SimpleObjectProperty<>(Cursor.WAIT)

控制器

代码语言:javascript
复制
//lifecycle
void onReadyStart(GriffonApplication application) {
    loadWindowData()
}

// both combo boxes contain the same items
protected void loadWindowData() {
    def list = [new ListElement(textValue: '')]
    list.addAll dataService.getData().collect {
        new ListElement(textValue: it.name, objectValue: it)
    }

    runInsideUIAsync {
        model.wcomboFromItems.addAll(list)
        model.wcomboToItems.addAll(list)
    }
}

void selectFrom() {
    performAction {
        gcListFrom = getControlList(model.wcomboFrom.objectValue)
        setTreeItems(model.wtreeGcFrom, gcListFrom, model.wcomboFrom)
        setTreeItems(model.wtreeGcTo, gcListTo, model.wcomboTo)
    }
}

void selectTo() {
    performAction {
        gcListTo = getControlList(model.wcomboTo.objectValue)
        setTreeItems(model.wtreeGcTo, gcListTo, model.wcomboTo)
    }
}

def performAction = {c ->
    Task<Void> t = new Task() {
        @Override protected Void call() {
            println "Running closure " + isUIThread()
            c.call()
        }
    }

    runInsideUISync {
        application.primaryStage.scene.cursorProperty().bind(Bindings.when(t.runningProperty())
            .then(model.CURSOR_WAIT).otherwise(model.CURSOR_DEFAULT))
    }

    runOutsideUI(t)
}

其他

代码语言:javascript
复制
@EqualsAndHashCode(includes = 'textValue')
class ListElement implements Serializable {
    String textValue = ""
    Serializable objectValue // Serializable object from business model

    @Override
    String toString() {
        textValue
    }
}

格里芬框架会自动调用UI线程之外的onAction控制器事件。GroovyFX包含一些魔术,它添加了一个绑定到selectionModel.selectedItemProperty的"onSelect“动作:

代码语言:javascript
复制
class GroovyFXEnhancer {
    static void enhanceClasses() {
        ...
        ComboBox.metaClass {
            cellFactory << { Closure closure -> delegate.setCellFactory(closure as Callback)}
            onSelect << { Closure closure ->
                delegate.selectionModel.selectedItemProperty().addListener(closure as ChangeListener);
        }
        ...
    }
}
EN

回答 1

Stack Overflow用户

发布于 2015-06-03 11:52:15

javafx中提供的这种模式有内置的解决方案吗?

我建议您使用内置的任务 ;)

它有预定义的方法来处理所需的一切。

代码语言:javascript
复制
private Task<Void> backgroundTask = new Task() {
    @Override
    protected Void call() throws Exception {
        // Something to do on background thread ;
        return null;
    }
};

它有一个runningProperty(),可以绑定到场景的cursorProperty()

您可以创建两个包含ObjectProperty<Cursor>Cursor.DEFAULTCURSOR.WAIT

代码语言:javascript
复制
final ObjectProperty<Cursor> CURSOR_DEFAULT = new SimpleObjectProperty<>(Cursor.DEFAULT);
final ObjectProperty<Cursor> CURSOR_WAIT = new SimpleObjectProperty<>(Cursor.WAIT);

然后,您可以将它们绑定到任务:

代码语言:javascript
复制
scene.cursorProperty().bind(Bindings.when(backgroundTask.runningProperty())
                                            .then(CURSOR_WAIT).otherwise(CURSOR_DEFAULT));

这是一个单独的问题,还是某种程度上是相关的?

如果您在ComboBox上的操作是以某种方式调用后台线程,那么它可能是相关的,否则很难进行注释。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30616552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档