2012-12-18 45 views
6

Tôi đang tạo giao diện người dùng cho ứng dụng của tôi chia sẻ một mô-đun lõi với các phiên bản cho các nền tảng khác. Trong JavaFX, tôi đang cố gắng sử dụng Task s để thực hiện mọi việc trong nền, nhưng tôi không thể tìm ra cách cập nhật trạng thái Tác vụ.Trạng thái thiết lập nhiệm vụ đồng thời JavaFX

Đây là những gì tôi đang cố gắng làm. Biến user giữ một thể hiện của một lớp mà thực hiện yêu cầu:

public Task<Integer> doLogin() 
{ 
    return new Task<Integer>() { 
     @Override 
     protected Integer call() 
     { 
      user.login(); 
      if (!user.getIsAuthorized()) 
      { 
       // set the state to FAILED 
      } 
      else 
      { 
       // set the state to SUCCEDED 
      } 
      user.remember(); 
     } 
    }; 

} 

Trong giao diện người dùng của tôi Chủ đề tôi muốn để có thể làm điều gì đó như thế này để cập nhật giao diện người dùng đồ thị của tôi:

loginTask.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent t) { 
       // perform an UI update here depending on the state t 
      } 
     }); 

thế nào là Tôi phải thiết lập nhà nước? Không có gì làm điều đó trong Task API. Các trạng thái

Trả lời

11

Task không được sử dụng cho logic người dùng. Chúng được giới thiệu để kiểm soát luồng Task. Để thêm logic người dùng vào Task, bạn cần sử dụng quan niệm result. Trong trường hợp của bạn, bạn có thể muốn sử dụng Task<Boolean> và kết quả của công việc của bạn sẽ được TRUE cho thông tin chính xác và FALSE cho đúng:

công tác tạo:

public Task<Boolean> doLogin() { 
    return new Task<Boolean>() { 
     @Override 
     protected Boolean call() { 
      Boolean result = null; 
      user.login(); 
      if (!user.getIsAuthorized()) { 
       result = Boolean.FALSE; 
      } else { 
       result = Boolean.TRUE; 
      } 
      user.remember(); 
      return result; 
     } 
    }; 
} 

Bắt đầu từ đó nhiệm vụ:

final Task<Boolean> login = doLogin(); 
login.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     // This handler will be called if Task succesfully executed login code 
     // disregarding result of login operation 

     // and here we act according to result of login code 
     if (login.getValue()) { 
      System.out.println("Successful login"); 
     } else { 
      System.out.println("Invalid login"); 
     } 

    } 
}); 
login.setOnFailed(new EventHandler<WorkerStateEvent>() { 
    @Override 
    public void handle(WorkerStateEvent t) { 
     // This handler will be called if exception occured during your task execution 
     // E.g. network or db connection exceptions 
     System.out.println("Connection error."); 
    } 
}); 
new Thread(login).start(); 
Các vấn đề liên quan