2017-01-01 9 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); 
       } 
      }); 
     }); 
} 

をしかし、それは変更される前に、それが画面上に非常に時間がかかり、何私ができるSEが終了した後、それはいつかフリーズこれらの方法のうち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 ---- 

しかし、ボタンを押してからのすべてには、色が、それが何秒かかり修正されています。

完全なコードは、あなたがPlatform.runLaterを使用して、多くのRunnable秒に投稿しているhere

+0

グリッドペインにはいくつのペインがありますか? –

+0

は約7200私は、最新のテストが、それはニースそれは本当に助けたのは約2800 – flaimme

答えて

1

見つけることができます。 onMouseClickedイベントハンドラがjavafxアプリケーションスレッド上で実行されるため、Platform.runLaterを使用する理由は一切ありません。

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

を使用すると、大幅にパフォーマンスを向上させる必要があります。

さらに、あなたはすべてのクリックのためRunnable秒の数を増加させるNode Sを削除せずに、あなたのrepaintAll方法(より具体的にritaGrundKalender法)におけるNode秒の巨大なamoutをを追加しているようです。この動作を変更することをお勧めします。

+0

までできるように依存する場合、あなたに感謝します!しかし、1つの奇妙なことは、最初にオブジェクトを押すと緑になるまでに時間がかかるが、2回目はすぐに行われているということです。それを解決するアイデアはありますか? – flaimme

+0

作成時に背景を追加して解決しました。 – flaimme

関連する問題