Tôi gặp sự cố khi làm việc với JavaFX và Chủ đề. Về cơ bản tôi có hai lựa chọn. Làm việc với Tasks
hoặc Perform.runLater
. Theo tôi hiểu Perform.runLater
nên được sử dụng cho các tác vụ đơn giản/ngắn, trong khi Task
cho các tác vụ dài hơn. Tuy nhiên, tôi không thể sử dụng chúng. Khi tôi gọi Thread
nó phải bật lên một hộp thoại xác thực ở giữa nhiệm vụ. Trong khi sử dụng Task
, nó bỏ qua yêu cầu của tôi để hiển thị hộp thoại mới ... Nó không cho phép tôi tạo giai đoạn mới. Mặt khác, khi tôi sử dụng Platform.runLater
, hãy để tôi hiển thị hộp thoại, tuy nhiên, cửa sổ chương trình bị đóng băng cho đến khi hộp thoại bật lên được hiển thị. Tôi cần bất kỳ loại giải pháp nào cho việc này. Nếu có ai biết cách đối phó với điều này hoặc đã có một số kinh nghiệm tương tự và tìm thấy một giải pháp tôi mong muốn được nghe từ bạn!JavaFX làm việc với các chủ đề và GUI
Trả lời
Như màu nâu nói, bạn phải sử dụng Task
hoặc Service
cho những điều mà bạn cần phải làm trong nền. Và Platform.runLater
để làm những việc trong chuỗi ứng dụng JavaFX từ chuỗi nền.
Bạn phải đồng bộ hóa chúng và một trong các cách để thực hiện điều đó là sử dụng lớp CountDownLatch
.
Dưới đây là một ví dụ:
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
//Background work
final CountDownLatch latch = new CountDownLatch(1);
Platform.runLater(new Runnable() {
@Override
public void run() {
try{
//FX Stuff done here
}finally{
latch.countDown();
}
}
});
latch.await();
//Keep with the background work
return null;
}
};
}
};
service.start();
Chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn rất nhiều! – ksarunas
Sử dụng Worker
(Task
, Service
) từ chuỗi Ứng dụng JavaFX nếu bạn muốn làm điều gì đó trong nền.
http://docs.oracle.com/javafx/2/api/javafx/concurrent/package-summary.html
Sử dụng Platform.runLater
từ một sợi nền nếu bạn muốn làm điều gì đó trên thread JavaFX Application.
Tôi tạo một Worker (Task). Một khi tôi cần như vậy hiển thị một cửa sổ pop up tôi gọi Platform.runLater tuy nhiên tôi cần phải chờ phản ứng (nó là hộp thoại đầu vào), nhưng nếu tôi tạo chủ đề mới (Platform.runLater) nó không chờ đợi cho respons và công nhân tiếp tục ... Làm thế nào để đối phó với nó. Có lẽ có một cách để tạm dừng thread công nhân chờ đợi cho đầu vào từ Platform.runLater và sau đó tiếp tục ...? – ksarunas
thể trùng lặp của [JavaFX2: Tôi có thể tạm dừng một nền Task/Dịch vụ] (http://stackoverflow.com/questions/14941084/javafx2-can-i- pause-a-background-task-service) – jewelsea