【问题标题】:Griffon groovyfx controller accessGriffon groovyfx 控制器访问
【发布时间】:2013-11-18 18:49:42
【问题描述】:

JavaFX 领域的真正新手,就这样吧。

griffon 1.4.0 - jdk 1.7.0_45

griffon 插件 (groovyfx-0.9.1, javafx-0.10.0)

我正在尝试为我的一个文本字段实现一个简单的焦点侦听器。这个想法是,一旦文本字段被聚焦,我想在同一视图中更改标签的消息。我确信答案很简单,但我想我已经把复杂的事情搞砸了。

对于整体上下文,我试图通过读取 fxml 并使用 groovy 视图进行绑定等来实现我的视图。

application(title: 'Myapp', sizeToScene: true, resizable: false, centerOnScreen: true) {
scene(fill: WHITE) {
    fxml(app.getResourceAsURL('fxtemplates/login.fxml').text) {
         // my bindings and onActions ( which are working great ) go in here
}

查看 groovyfx 文档,似乎没有像 onAction 那样的 onFocus 方法,因此我必须向focusedProperty 添加一个侦听器 - 非常棒。我首先尝试为 ChangeListener 编写一个闭包:

aTextField.focusedProperty().addListener({ obsVal, oldVal, newVal ->
       // do something...    
})

但是 Uberbuilder 抱怨,我显然做错了(朝这个方向轻推会有所帮助)

所以我写了一个空的 FocusListener 类来实现一个 ChangeListener,然后在我的视图中绑定它。

class FocusListener implements ChangeListener<Boolean> {

@Override
public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
    // for the view to override...
}

}

那么在我看来

aTextField.focusedProperty().addListener(new FocusListener () {

            @Override
            public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
                if(newVal != null && newVal == Boolean.TRUE) {
                    execInsideUIAsync {
                    println 'focus gained'

                    }
                }
            }

        });

代码执行得很好(获得焦点打印)但当然我在范围内,所以我无权访问我的控制器或视图组件。为了咧嘴笑(不是真的喜欢它,而是尝试一下),我将控制器传递给我的 FocusListener 的构造函数,并在我的控制器上调用了一个方法。

class FocusListener implements ChangeListener<Boolean> {

def controller

public FocusListener(controller) {
    this.controller = controller
}

@Override
public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
    // for the view to override...
}

}

然后在我看来

aTextField.focusedProperty().addListener(new FocusListener (controller) {

            @Override
            public void changed(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal ) {
                if(newVal != null && newVal == Boolean.TRUE) {
                    println "Gained Focus"
                    execInsideUIAsync {
                       println 'focus gained'
                        controller.&clearMessages
                    }
                }
            }

        });

没有任何抱怨,但我的控制器方法从未执行(也没有任何抱怨,输出是“获得焦点”。在我的调试器中,我确实看到了对控制器的引用......但在这一点上,我陷入了困境并确定不正确的实现......

有人可以帮帮我吗?

谢谢!

【问题讨论】:

  • 如果您执行操作而不是从中创建 ClosureMethod,那么您的最后一个示例应该可以工作。语法 object.&methodName 用于创建闭包,因此您不会调用操作。

标签: javafx griffon groovyfx


【解决方案1】:

好的 - 所以经过更多的修补(并且运行良好)。这很容易。

在视图中,我向文本字段的focusedProperty 添加了一个侦听器。因此,模型中引用了该侦听器:

aTextField.focusedProperty().addListener(model.fieldFocusListener)

然后在模型中我对已经绑定的值进行更改

@FXBindable String field_one
@FXBindable String field_two
@FXBindable String message

//...

ChangeListener fieldFocusListener

void mvcGroupInit(Map args) {

    fieldFocusListener = new ChangeListener() {
        @Override
        void changed(ObservableValue observableValue, Object t, Object t1) {
           this.setMessage('your message here')
        }
    }

}

这对我来说在模型中完全有意义,因为我拥有操作视图所需的所有访问权限。无论如何,我希望这可以帮助其他有需要的人。

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2013-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 2013-03-20
    相关资源
    最近更新 更多