2014-03-15 3 views
0

У меня есть программа, которая не в потоке приложений JavaFX, и я хочу вызвать в нее какое-то приложение JavaFX, чтобы что-то сделать для меня. Вот мой код:Как закончить потоки JavaFX и завершить их при вызове Platform.runLater()?

public void extractImages(Document document) { 
     ImageExtractor_HTML_Data.getInstance().documentId = document.getId(); 
     if (!ImageExtractor_HTML_Data.getInstance().started) 
      new JFXPanel(); 
     ImageExtractor_HTML_Data.getInstance().started = true; 
     Platform.runLater(new Runnable() { 
      ImageExtractor_HTML_Browser browser = new ImageExtractor_HTML_Browser(); 

      @Override 
      public void run() { 
       browser.start(new Stage()); 
      } 
     }); 

     synchronized (ImageExtractor_HTML_Data.getInstance()) { 
      try { 
       ImageExtractor_HTML_Data.getInstance().wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

И мой класс Браузер:

public class ImageExtractor_HTML_Browser extends Application { 
    private Scene scene; 

    @Override 
    public void start(Stage stage) { 

     /* Some code */ 

     stage.setTitle("Web View"); 
     Browser browser = new Browser(htmlFile, stage); 
     scene = new Scene(browser, 750, 500, Color.web("#666970")); 
     stage.setScene(scene); 
     stage.show(); 
     browser.imageExtractor(new ImageHandler_DB_HTML(document)); 
    } 

И мой метод imageExtractor является:

public void imageExtractor(final ImageHandler handler) { 
     webEngine.getLoadWorker().stateProperty() 
       .addListener(new ChangeListener<Worker.State>() { 
        @Override 
        public void changed(
          @SuppressWarnings("rawtypes") ObservableValue observableValue, 
          Worker.State state, Worker.State newState) { 
         if (newState.equals(Worker.State.SUCCEEDED)) { 
          /* Some code which extract some data */ 
          synchronized (ImageExtractor_HTML_Data 
            .getInstance()) { 
           ImageExtractor_HTML_Data.getInstance().notify(); 
          } 
          stage.close(); 
          Platform.exit(); 
          return; 
         } 
        } 
       }); 
    } 

В методе imageExtractor я хочу, чтобы ждать, пока мой HTML файл загрузите полностью, а затем я хочу что-то сделать, поэтому я использую WebEngine.getLoadWorker.etc. Моя проблема в том, что после запуска этого кода мои потоки JavaFX не закончились, поэтому моя программа не закончилась. Хотя я не хочу использовать System.exit (0), потому что моя программа выполняется в середине проекта, который выполняется через tomcat, и если я использую System.exit (0), весь проект падает, что не очень хорошо все!

Может ли кто-нибудь мне помочь?

ответ

0

Наконец-то я понимаю проблему. это из-за «нового JFXPanel()», который я вызывал для инициализации инструментария JavaFX. Я называю это в другом месте, и мой код правильный! Это исправленная версия:

public void extractImages(Document document) { 
     ImageExtractor_HTML_Data.getInstance().documentId = document.getId(); 

     Thread javaFxThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       new JFXPanel(); 
       Platform.runLater(new Runnable() { 
        ImageExtractor_HTML_Browser browser = new ImageExtractor_HTML_Browser(); 

        @Override 
        public void run() { 
         browser.start(new Stage()); 
        } 
       }); 
      } 
     }); 
     javaFxThread.setDaemon(true); 
     javaFxThread.start(); 

     synchronized (ImageExtractor_HTML_Data.getInstance()) { 
      try { 
       ImageExtractor_HTML_Data.getInstance().wait(); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 
Смежные вопросы