2012-08-17 3 views
1

간단한 사용자 이름, 비밀번호 및 로그온 버튼이있는 매우 간단한 JavaFX 컨트롤러가 있습니다.JavaFX UI 렌더링 지연 문제

는 내가하고 싶은 것은 사용자가 로그온을 클릭 할 때, 나는 안 함 입력합니다 - 내가 함께 코드에서 할 -이 작동하지만 내 문제는 - 그것은 것으로 보인다

this.gridPanelLogon.setDisabled(true); 

과 이 호출 후에 웹 REST 서비스에 대한 JerseyClient 호출을 만든다. 코드가 완료되면 UI를 업데이트하고 gridPanel을 비활성화한다. 하지만 내가 원하는 것은 gridPanel이 먼저 THEN을 호출하지 못하도록하고, UI가 모든 코드가 실행 된 후에 만 ​​업데이트되는 것입니다 (위 코드 행에 맞을 때 올바르지 않습니다).

내가이 사실을 잘못 설명하면 사과 드리 겠지만 더 자세히 설명하는 데 기꺼이 도움을 주지만 어쩌면 누군가가 이것을 경험했기 때문에 이유 또는 해결 방법을 설명하는 데 도움이되기를 바랍니다. gridPanel의 비활성화 된 속성에 변경 리스너를 추가하는 작업을 한 번 시도해 보았습니다. 이는 작동하지 않아 위에서 언급 한 것과 동일한 지연이 발생했습니다.

모든 도움을 주시면 감사하겠습니다. - 감사합니다.

답변

1

JavaFX 응용 프로그램 스레드에서 client => 서버 호출을 실행하지 말고 own thread에서 Task 또는 Service을 통해 실행하십시오.

+0

예! 이것을 다시 한번 고맙다. - 나는 이것을 단지 실험하고 있었다! 맞아 - JavaFX 스레드가 하나의 스레드에 있고 클라이언트 -> 서버 호출이 새 스레드를 만들고 JavaFX는이 스레드가 현재 스레드를 완료하기 전에 완료 될 때까지 기다렸습니다. 위의 링크의 솔루션은 [서비스] (http://docs.oracle.com/javafx/2/api/javafx/concurrent/Service.html)입니다. 귀하의 사려 깊고시기 적절한 답변 인 jewelsea에 다시 한번 감사드립니다! – user1589081

0

jewelsea에게 다시 한 번 감사드립니다. 그는 많은 JavaFX 질문에 잘 답변합니다. 이 솔루션을 공유하고 싶었습니다.이 솔루션은 제 테스트에서 잘 작동합니다. Jersey-Client REST 요청을 작성하고 javafx.concurrent.Service를 확장하는 별도의 클래스를 만들지 않고 JavaFX 응용 프로그램에 배치했습니다.

그래서 아래에 나와있는 작업은 위에 제공된 jewelsea 링크를 고려하여 나에게 잘 맞는 해결책을 제공하는 것입니다. 이 Service 클래스는 제공된 URL에 성공적으로 게시 한 후 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; 
      } 
     }; 
    } 
}