java - 即使在重置存储库后,代码也很慢 (JavaFX)

标签 java eclipse listview javafx-2

我刚刚遇到了一个奇怪的行为,我什至不能说它是 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/

相关文章:

java - 像 IntelliJ 一样在 Eclipse 中使用 Lambda 建议

Android库项目在命令行使用gradle编译时无法导入另一个库项目的R类

Java:调用静态方法但没有任何反应?

java - Android Kinvey java.lang.NoClassDefFoundError

java - 什么是 Java 中的双大括号初始化?

java - Eclipse 调试器似乎无缘无故地退出了,以前有人处理过这个问题吗?

java - 如何在Android ListView中加载list_item_event.xml?

android - 在 Android 中实现 switch case 语句的正确方法是什么?

java - Android ListView 自定义行

java - 启动 Grizzly Web 服务器的最佳方式是什么?