JavaFXシーンの真の初心者なので、ここに行きます。
グリフォン 1.4.0 - jdk 1.7.0_45
グリフォン プラグイン ( groovyfx-0.9.1、javafx-0.10.0)
テキストフィールドの 1 つに単純なフォーカス リスナーを実装しようとしています。テキストフィールドがフォーカスされたら、同じビュー内でラベルのメッセージを変更したいという考えです。答えは簡単だと思いますが、複雑な問題は乗り越えたと思います。
全体的なコンテキストについては、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 は不平を言いました、そして、私は明らかにそれを間違っています (この方向へのナッジが助けになるでしょう)。
そこで、ChangeListener を実装する空の FocusListener クラスを作成し、それをビューにバインドしました。
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
}
}
}
});
何も不満はありませんでしたが、コントローラーメソッドは決して実行されませんでした(何も不満はありませんでした。出力は「フォーカスが得られました」でした。私のデバッガーでは、コントローラーへの参照が表示されます...しかし、この時点で、私はうさぎの穴に落ちており、間違った実装...
誰か助けてくれませんか?
ありがとう!