我刚刚遇到了一个奇怪的行为,我什至不能说它是 JavaFX 特定问题、Eclipse 问题,甚至不知道从哪里开始修复。
但首先要做的是:我正在编写一个 JavaFX 应用程序 (Eclipse Kepler/Java 1.7),其中包含一些扩展的 ListView。程序加载大约需要 1 秒。
扩展的 ListView 看起来像这样:
public class NewList<T extends Obj> extends ListView<T>{
public NewList(){
// addEventHandler(KeyEvent.KEY_RELEASED, new EventHandler<KeyEvent>(){
//
// @Override
// public void handle(KeyEvent arg0) {
// if(arg0.getText().equals(KeyCode.DELETE)){
// getItems().remove(getSelectionModel().getSelectedItem());
// }
// }
// });
}
}
在同一构造函数中还有一些 MouseEvents(如拖放),它们按预期工作。 现在我想向我的扩展 ListView 添加一个 EventHandler(请参阅上面代码中的推荐)。 代码现在需要大约 8 秒才能开始,也就是正常情况下的 8 倍。令我惊讶的是,该程序 90% 的加载时间都在我的 primaryStage 的 .show() 方法中(只有一个)。加载时间过后,GUI 极其缓慢,CPU 使用率达到 100%。 可能 Handler 实现错误,并且一直在做一些奇怪的事情。
我在互联网上找不到任何解决方案甚至类似的问题....但现在真正的问题才刚刚开始: 当我删除 Handler 并再次运行程序时,它会保持缓慢!所以程序的状态和以前一样——只是还是坏了!这让我很抓狂,因为我看不出对这种行为有任何合乎逻辑的解释。
我已经尝试过的:
- 删除存储库中的 bin 文件夹并重新构建代码 (+reboot)
- 通过git重置仓库
- 扔掉一半的代码,重新开始。在任何时候它都再次起作用,不幸的是我无法重现这种效果。然后我又实现了Handler,问题从头开始......
编辑:看起来在构建过程/更新二进制文件期间出了点问题。我删除了 99% 的代码(>5k LOC),然后就可以了。我将原始项目复制/粘贴回我的工作区,孔代码运行顺利 - 即使 Handler 处于开启状态。所以我无法想象一种产生简约设置的方法。顺便说一句:我不允许发布完整的项目文件夹(大学的东西......)
edit2:我使用 win7 64 位和 java64。其他 javaFX 程序正在运行(即使是 grafic 密集型 oracle 示例)。我没有使用任何 JavaFX 特定的存储库设置或构建器
最佳答案
好吧,几分钟前我遇到了同样的问题,这次我想我找到了根源。
我总是在 Debug模式下运行我的代码。为了检查 EventHandlers 条件,我在 Eclipse 中创建了一些断点。我还在以下代码行创建了一个断点(更多代码见上文)
public void handle(KeyEvent arg0) {
将鼠标悬停在断点上会提供以下信息:
Multiple markers at this line
Method breakpoint:NewList [Entry] - handle(KeyEvent)
implements:javafx.event.EventHandler .handle
我不知道这里究竟发生了什么,但我认为它是这样的: 我正在覆盖 JavaFX EventHandler 方法,调试器必须检查每个 JavaFX 交互/EventHandler 调用的断点。所以 Eclipse 无法在适当的时间处理大量的检查,而且一切似乎都很慢。 要清除它:断点本身不必在任何时候调用,只要它存在就足以引起问题。
停用断点或以非 Debug模式运行应用程序将解决所有问题。我认为在任何类型的 Listener/EventHandler 中避免所有入口断点应该是个好主意 :)
关于java - 即使在重置存储库后,代码也很慢 (JavaFX),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21346220/