1

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
                    }
                }
            }

        });

何も不満はありませんでしたが、コントローラーメソッドは決して実行されませんでした(何も不満はありませんでした。出力は「フォーカスが得られました」でした。私のデバッガーでは、コントローラーへの参照が表示されます...しかし、この時点で、私はうさぎの穴に落ちており、間違った実装...

誰か助けてくれませんか?

ありがとう!

4

1 に答える 1

1

わかりました-それで、さらにいじくり回した後(そして良い走りをした後)。とても簡単です。

ビューで、textfield の focusdProperty にリスナーを追加しました。そのリスナーは、次のようにモデルで参照されます。

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')
        }
    }

}

ビューを操作するために必要なすべてのアクセス権を持っているので、モデルではこれは完全に理にかなっています。とにかく、これが困っている誰かを助けることを願っています。

于 2013-11-18T23:40:31.223 に答える