JavaFX UI渲染延迟问题

时间:2012-08-17 23:30:53

标签: java user-interface javafx javafx-2 delay

我有一个非常简单的JavaFX Controller,带有一个简单的用户名,密码和登录按钮。

我想要做的是当用户点击登录时,我希望禁用输入 - 我在代码中执行以下操作:

this.gridPanelLogon.setDisabled(true);

并且 - 这可行,但我的问题是 - 它似乎是线程化的,因为在此调用之后我然后对一个Web服务进行JerseyClient调用 - 一旦该代码完成它,然后更新UI并禁用gridPanel。但我想要的是gridPanel首先禁用THEN来调用,似乎UI只在所有代码运行后更新(当它碰到上面的代码行时不正确)。

如果我解释得不好,我道歉,我很乐意帮助澄清更多,但希望也许有人经历过这个,并且可以帮助解释原因或解决方法。我还尝试了另外一项工作,将更改侦听器放入gridPanel的disabled属性 - 这不起作用并导致与上述相同的延迟。

非常感谢任何帮助 - 谢谢!!

2 个答案:

答案 0 :(得分:1)

不要运行client =>服务器调用JavaFX应用程序线程,而不是通过own threadTaskService中运行它们。

答案 1 :(得分:0)

再次感谢jewelsea - 他很好地解答了许多这些JavaFX问题。我想分享这个解决方案,这在我的测试中适用于我的应用程序。我正在制作一个Jersey-Client REST请求,并将其放在我的JavaFX应用程序中(没有创建一个扩展javafx.concurrent.Service的单独类)。

因此,我在下面所做的就是提供适合我的解决方案,同时考虑到jewelsea上面提供的链接。成功POST到提供的URL后,此Service类将返回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;
            }
        };
    }
}