1

シンプルなユーザー名、パスワード、およびログオンボタンを備えた非常にシンプルなJavaFXコントローラーがあります。

私がしたいのは、ユーザーがログオンをクリックしたときです。入力を無効にしたいのですが、これはコードで次のように行います。

this.gridPanelLogon.setDisabled(true);

そして-これは機能しますが、私の問題は-スレッド化されているように見えます。この呼び出しの後、JerseyClient を Web REST サービスに呼び出します-そのコードが完了すると、UI を更新し、gridPanel を無効にします。しかし、私が望むのは、gridPanel が最初に THEN の呼び出しを無効にすることです。UI は、すべてのコードが実行された後にのみ更新されるようです (上記のコード行にヒットしたときは正しくありません)。

説明が不十分だった場合はお詫び申し上げます。さらに明確にするお手伝いをさせていただきますが、誰かがこれを経験したことがあり、理由を説明するか、回避策を提供できることを願っていました。また、gridPanel の無効なプロパティに変更リスナーを配置して、別の回避策を試しましたが、これは機能せず、上記と同じ遅延が発生しました。

どんな助けでも大歓迎です-そしてありがとう!!

4

2 に答える 2

1

JavaFX アプリケーション スレッドで client => server 呼び出しを実行しないでください。代わりに、 TaskまたはServiceを介して独自のスレッドで実行します。

于 2012-08-18T00:14:37.050 に答える
0

もう一度、jewelsea に感謝します。彼は、これらの JavaFX の質問の多くにとてもよく答えてくれます。私のテストでは、私のアプリケーションでうまく機能するこのソリューションを共有したかったのです。私はJersey-Client RESTリクエストを作成していて、これをJavaFXアプリケーション内に配置していました(javafx.concurrent.Serviceを拡張する別のクラスを作成せずに)。

したがって、以下で行ったことは、上記のリンクの宝石を考慮して、私にとってうまくいった解決策を提供することです. この Service クラスは、提供された URL への POST が成功した後、ClientResponse オブジェクトを返します。以下のコメントで、これに関するより多くのメモを提供しようとしました。

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientHandlerException;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.concurrent.Service;
import javafx.concurrent.Task;

/**
 * This Service class will make REST calls to a given URL,
 * with a JSON encoded request string.
 *
 * OnSucceeded will return a ClientResponse object - will be
 * null if an exception occurred - if no exception is the
 * ClientResponse result of the Jersey-Client call.
 */
public class JerseyClientPostService extends Service<ClientResponse> {

    private StringProperty url = new SimpleStringProperty();
    private StringProperty json = new SimpleStringProperty();

    public JerseyClientPostService() {
        super();
    }

    public JerseyClientPostService(String url, String json) {
        super();
        this.url.set(url);
        this.json.set(json);
    }

    public final String getUrl() {
        return this.url.get();
    }

    public final String getJson() {
        return this.json.get();
    }

    public final void setJson(String json) {
        this.json.set(json);
    }

    public final void setUrl(String url) {
        this.url.set(url);
    }

    @Override protected Task<ClientResponse> createTask() {

        final String _url = getUrl();
        final String _json = getJson();

        return new Task<ClientResponse>() {
            @Override protected ClientResponse call() {
                Client client = Client.create();

                WebResource webResource = client.resource(_url);

                ClientResponse response;
                try {
                    response = webResource.type("application/json").post(ClientResponse.class, _json);
                }
                catch (ClientHandlerException che) {
                    System.err.println("ClientHandlerException connecting to Server: "+che.getMessage());
                    return null;
                }
                catch (Exception ex) {
                    System.err.println("Exception getting response Json: "+ex.getMessage());
                    return null;
                }
                return response;
            }
        };
    }
}
于 2012-08-18T03:31:08.687 に答える