2017-01-01 3 views
0

Моя проблема в том, что мое приложение JavaFx прошло очень медленно. И в начале приложения, и в некоторых из инициированных событий. Это приложение календаря, которое использует GridPane, которое я изменяю. У меня есть этот метод:JavaFx зависает после метода

t.setOnMouseClicked(event->{ 

     long starttid = System.currentTimeMillis(); 
     System.out.println("start"); 
     if (markedTimeEnd != null && markedTimeStart != null) { 
      colorMinutes(markedTimeStart, markedTimeEnd, Color.BLACK, bakrundWhite); 
     } else if (markedTimeStart != null) { 
      colorMinutes(markedTimeStart, markedTimeStart, Color.BLACK, bakrundWhite); 
     } 

     long tidNu = System.currentTimeMillis(); 
     long tid = tidNu-starttid; 
     System.out.println("Print first time:\n"+tid); 

     int minutTid = gridPane.getRowIndex(t); 
     int timmeTimme = minutTid/60; 
     int minutMinut = minutTid - (60 * timmeTimme); 
     markedTimeStart = new TidPunkt(timmeTimme, minutMinut); 
     markedTimeEnd = null; 

     tid = System.currentTimeMillis() -tidNu; 
     tidNu = System.currentTimeMillis(); 
     System.out.println("Time for the middel calculations:\n"+tid); 
     if (markedTimeEnd != null && markedTimeStart != null) { 
      colorMinutes(markedTimeStart, markedTimeEnd, Color.GREEN,bakrundGren); 
     } else if (markedTimeStart != null) { 
      colorMinutes(markedTimeStart, markedTimeStart, Color.GREEN,bakrundGren); 
     } 
     event.consume(); 
     repaintAll(); 
     System.out.println("Time to end:\n"+(System.currentTimeMillis()-tidNu)); 
    }); 

И код для colorMinutes:

private void colorMinutes(TidPunkt markedTimeStart, TidPunkt markedTimeEnd, Color colorText, Background colorOther) { 

    System.out.println("The call is comming"); 

    int startBothTogether = markedTimeStart.getTimme() * 100 + markedTimeStart.getMinut(); 
    int endBothTogether = markedTimeEnd.getTimme() * 100 + markedTimeEnd.getMinut(); 

    System.out.println("Befor filter"); 
    gridPane.getChildren().stream()//parallelStream() 
     .filter(x-> x.getId()!=null) 
     .filter(y-> y.getId().matches("\\d\\d:\\d\\d")) 
     .filter(pp->{ 
      int hoursForPart = Integer.parseInt(((Node) pp).getId().split(":")[0]); 
      int miutesForPart = Integer.parseInt(((Node) pp).getId().split(":")[1]); 
      int bothTogether = hoursForPart * 100 + miutesForPart; 
      if (bothTogether >= startBothTogether && bothTogether <= endBothTogether) 
       return true; 
      else 
       return false; 
     }) 
     .forEach(pp->{ 
      Platform.runLater(() -> { 
       System.out.println("Changing collor ----"); 
       if(pp instanceof Pane){ 
        ((Pane) pp).setBackground(colorOther) 
       }else{ 
        ((Text) pp).setFill(colorText); 
       } 
      }); 
     }); 
} 

Но это занимает очень долго, прежде чем это изменение на экране, и он застывает через некоторое время после того, что я могу себе это отделка этих методов на System.out.println. Я пытался профилировать, но не могу понять (лучше всего я придумал это, похоже, это большое дерево вызовов, из javaFx «stuff» при выходе из метода). В System.out.println отпечатков:

start 
Print first time: 
0 
Time for the middel calculations: 
0 
The call is comming 
Befor filter 
Time to end: 
373 
Changing collor ---- 
Changing collor ---- 
Changing collor ---- 
Changing collor ---- 

Но от нажатия кнопки, чтобы все время цвет исправить это занимает много секунд.

Полный код можно найти here

+0

Сколько панелей находится внутри панели сетки? –

+0

Приблизительно 7200, когда я последний раз тестировал, но это зависит от того, может ли быть примерно до 2800. – flaimme

ответ

1

Вы размещения многих Runnable с использованием Platform.runLater. Здесь нет оснований использовать Platform.runLater, так как обработчик события onMouseClicked выполняется в любом случае приложения javafx.

Использование

.forEach(pp->{ 
    if(pp instanceof Pane){ 
     ((Pane) pp).setBackground(colorOther) 
    }else{ 
     ((Text) pp).setFill(colorText); 
    } 
}); 

должны улучшить производительность резко.

Кроме того, вы, кажется, добавить огромный amout из Node с вашим repaintAll метода (более конкретно ritaGrundKalender метода) без удаления Node с, что увеличивает число Runnable с за каждый клик. Я предлагаю вам изменить это поведение.

+0

Приятно, что это действительно помогло, спасибо! Но одна странная вещь заключается в том, что при первом нажатии объекта требуется некоторое время, прежде чем он станет зеленым, но второй раз делается немедленно, есть ли у вас какая-то идея решить это? – flaimme

+0

Решил, добавив фон при их создании. – flaimme