java - JFrame 组件的这种奇怪的延迟是什么?

标签 java eclipse swing java-8

编辑:虽然我在今天之前从未使用过(甚至不知道)SwingUtilities.InvokeLater(),但实现它并没有解决问题。 JFrame 的可见性和 JLabel 的外观之间存在 1 秒的延迟,这一点在以下更新的代码中仍然存在。

public class DelayTest {

public static void main(String [] args) {
    new DelayTest();
}

public DelayTest() {
     SwingUtilities.invokeLater(new Runnable() 
        {
          public void run()
          {
              long start = System.currentTimeMillis();
            JFrame frame = new JFrame("Demo");
            Container content = frame.getContentPane();

            //sizing
            Dimension dimm = new Dimension(500, 200);
            frame.setPreferredSize(dimm);
            frame.setResizable(false);

            //content
            content.add(new JLabel("Hello, Delayed World"));
            System.out.println("Added Label at: " + 
                    (System.currentTimeMillis() - start) + " Milliseconds");

            //end
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
            System.out.println("Finished execution at: " + 
                    (System.currentTimeMillis() - start) + " Milliseconds");
          }
        });
    }
}

到目前为止,我已执行以下操作来尝试解决该错误:

  • 更新了我的计算机 (Mac OS X 10.11.6)
  • 更新了 Java(Java 版本“1.8.0_111”)
  • 删除并重新安装 Eclipse (Java Neon.2)
  • 导出jar,只是为了看看Eclipse之外是否存在问题
  • 使用 SwingUtilities.InvokeLater() 进行测试,如上所示(希望我正确使用了它)

在整个过程中我重新启动了几次,但似乎没有任何解决办法。我希望您可以帮助我找到代码中导致标签延迟的错误(我认为该错误不存在),或者验证我的代码是否可以在您的计算机上运行。

最佳答案

事实证明,通过为 content 容器指定 LayoutManager ,我的问题立即得到了解决。我现在假设这是一个奇怪的 Java bug,也许只在 Mac 上。以下代码解决了我的问题:

public class DelayTest {

public static void main(String [] args) {
    new DelayTest();
}

public DelayTest() {
     SwingUtilities.invokeLater(new Runnable() 
        {
          public void run()
          {
              //long start = System.currentTimeMillis();
            JFrame frame = new JFrame("Demo");
            Container content = frame.getContentPane();

            //NEW CODE
            content.setLayout(new BoxLayout(content, BoxLayout.PAGE_AXIS));
            //END NEW CODE

            //sizing
            Dimension dimm = new Dimension(500, 200);
            frame.setPreferredSize(dimm);
            frame.setResizable(false);

            //content
            content.add(new JLabel("Hello, Delayed World"));

            //end
            frame.pack();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);

          }
        });
    }
}

拥有一个不使用一个布局管理器或另一个布局管理器的 GUI 几乎完全没有意义,这解释了为什么我以前从未见过这个问题。

TL;DR:即使您只需要在窗口中显示一个组件,也始终使用 LayoutManager(显然还有 SwingUtilities.invokeLater())。

关于java - JFrame 组件的这种奇怪的延迟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41705266/

相关文章:

java - 无法让嵌套 fragment 工作,无法解析 getChildFragmentManager

java - 如何访问java程序中触发的graphql查询?

java - 在liferay中使用ajax

主线程中的 Java 异常 - ClassNotFoundException

java - 如何动态更改 JSplitPane 中的组件

Java Swing ContentPane 令人困惑的语句

java - 使用 testng 检测 @afterMethod 中跳过的测试

java - 安装 Eclipse RCP 插件

java - 垂直滚动条覆盖jtable的最后一列数据(最后一列数据右对齐)

android - 从模拟器发送短信到其他手机号码后如何进行确认?