gpt4 book ai didi

JavaFx 在方法完成后卡住

转载 作者:行者123 更新时间:2023-12-01 09:04:15 25 4
gpt4 key购买 nike

我的问题是我的 JavaFx 应用程序变得非常慢。在应用程序的启动和一些触发的事件中。这是一个使用 GridPane 的日历应用程序,我正在修改它。我有这个方法:

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

最佳答案

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

使用

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

应该会大幅提高性能。

此外,您似乎在 repaintAll 方法(更具体地说是 ritaGrundKalender 方法)中添加了大量 Node,而没有删除 Node 会增加每次点击的 Runnable 数量。我建议你改变这种行为。

关于JavaFx 在方法完成后卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41416672/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com