2017-01-01 58 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“东西”的一个大调用树)。该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

您发布使用Platform.runLater许多Runnable秒。无论如何,没有理由在这里使用Platform.runLater,因为反正在javafx应用程序线程上执行onMouseClicked事件处理程序。

使用

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

应大幅提高性能。

而且你似乎在你repaintAll方法(更具体的ritaGrundKalender法)不删除Node S的增加Runnable S中的数量为每点击添加Node秒的巨量。我建议你改变这种行为。

+0

不错,它确实帮助,谢谢!但奇怪的是,第一次按下目标需要一段时间才会变绿,但第二次是立即完成,你有什么想法来解决这个问题? – flaimme

+0

创建它们时通过添加背景来解决它。 – flaimme