我有一个非常简单的JavaFX Controller,带有一个简单的用户名,密码和登录按钮。
我想要做的是当用户点击登录时,我希望禁用输入 - 我在代码中执行以下操作:
this.gridPanelLogon.setDisabled(true);
并且 - 这可行,但我的问题是 - 它似乎是线程化的,因为在此调用之后我然后对一个Web服务进行JerseyClient调用 - 一旦该代码完成它,然后更新UI并禁用gridPanel。但我想要的是gridPanel首先禁用THEN来调用,似乎UI只在所有代码运行后更新(当它碰到上面的代码行时不正确)。
如果我解释得不好,我道歉,我很乐意帮助澄清更多,但希望也许有人经历过这个,并且可以帮助解释原因或解决方法。我还尝试了另外一项工作,将更改侦听器放入gridPanel的disabled属性 - 这不起作用并导致与上述相同的延迟。
非常感谢任何帮助 - 谢谢!!
答案 0 :(得分:1)
不要运行client =>服务器调用JavaFX应用程序线程,而不是通过own thread或Task在Service中运行它们。
答案 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;
}
};
}
}