2016-06-20 2 views
0

Извините, заголовок неопределенный, но я думаю, что нашел глюк в классе JavaFX BorderPane, но я не уверен. Так что я выполняю этот метод внутри объекта параллельной задачи javaFx, который находится внутри Thread. Этот метод работает до тех пор, пока он не ударит по заявлениям печати. Он печатает 1, а затем не проходит мимо метода root.setCenter. Если я прокомментирую этот код, он движется дальше, иначе он застрянет на нем, как будто он находится в бесконечном цикле. Важно отметить, что корень (объект boderpane) локально хранится в основном потоке JavaFX. Спасибо за любые предложения.Возможный глюк, найденный в JavaFX

// will be used to store all the sites we still need to visit so we can do 
    // a breadth first graph traversal of the hostsite 
    Queue<URL> unvistedURLs = new LinkedList<>(); 
    LinkedList<Text> currentLevelText = new LinkedList<>(); 
    Queue<URL> levelCheckpoints = new LinkedList<>(); 
    int currentLevelHieght = 0; 

    // the origional host 
    String hostName = origin.getHost(); 

    // temporary objects 
    HTMLLinks endHTMLLinks = null; 
    try 
    { 
    endHTMLLinks = new HTMLLinks(origin); 
    } 
    catch (IOException e1) 
    { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } 

    HostSiteInfo hostSiteInfo = new HostSiteInfo(); 
    URL currentURL; 
    Group displayArea = new Group(); 

    System.out.println(1); 
    root.setCenter(displayArea); 
    System.out.println(2); 
    // imediatley input the host as a site we need to visit 
    unvistedURLs.add(origin); 
    levelCheckpoints.offer(origin); 


@Override 
public void start(Stage primaryStage) 
{ 
    try 
    { 
    final BorderPane root = new BorderPane(); 
    Scene scene = new Scene(root, 1600, 1000); 

    @SuppressWarnings("rawtypes") 
    Thread renderThread = new Thread(new Task(){ 

     @Override 
     protected Object call() throws Exception 
     { 
      try 
      { 

       WebSpider.traverseURLs(root, 
        new URL("http://www.georgefox.edu/"), 
        new PrintStream(System.out)); 
      } 
      catch (MalformedURLException e) 
      { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      return null; 
     }}); 

    renderThread.setDaemon(true); 
    renderThread.start(); 

Корень приложения JavaFX инициализируется в методе этого запуска.

+0

где инициализируется 'root'? –

+0

Я добавил новый код –

+0

Извините, почему-то этот сайт думал, что это не код. –

ответ

0

Предполагая, что root.setCenter вызван внутри Task (это неясно из вашего кода), вы получаете исключение, потому что пытаетесь изменить граф сцены из потока, отличного от потока интерфейса JavaFX. Поскольку это делается внутри Task, исключение попадает под задачу, и вы не видите ее.

Чтобы решить эту проблему заменить root.setCenter(displayArea) с

Platform.runLater(() -> root.cetCenter(displayArea)); 

См Platform#runLater.

Чтобы быть в состоянии поймать такие проблемы, то, вероятно, лучше, чтобы установить onFailed обработчик к вашему Task:

Task<Void> myTask = new Task<>() { 
    ... 
} 
myTask.setOnFailed(workerStateEvent -> { 
    System.out.println("Something wrong happened..."); 
    myTask.getException().printStackTrace(); 
    // Or handle the problem however suits your application. 
}); 
+0

О, мне было интересно, если бы было поймано исключение, это, вероятно, исправит мой код! –

Смежные вопросы