2013-05-23 35 views
10

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

+0

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

Trả lời

25

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(); 
+0

Chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn rất nhiều! – ksarunas

6

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.

http://docs.oracle.com/javafx/2/api/javafx/application/Platform.html#runLater%28java.lang.Runnable%29

+0

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