我正在编写一个非常简单的程序,每5分钟执行一次操作。我目前正在尝试设置一个计时器并通过使其递增一个数字来对其进行测试。我从一个相关问题中复制了一些代码,其中包括有问题的代码(CIQ),最后得到了下面的内容。我注意到一种我无法解释的行为:

如果CIQ保留在原位,则无论延迟值是多少,程序都会按预期运行。但是,如果删除了CIQ(就像我为切掉不需要的部件(例如Windows)所做的那样),则程序会自行停止所有值小于900的操作。 800,它等于1000的2或3,终止于更高的值而根本不增加。这是怎么回事据我了解,CIQ指定了虚拟窗口的样式,然后打包它。这与在后台某处运行的计时器有什么关系,为什么在所描述的值范围内会发生这种情况?我已经读到JFrame是Swing的顶级容器,但是如果Swing的东西需要它工作,为什么有时没有它,计时器有时也可以工作?它与垃圾回收或其他有关吗?

时间:

    public class Time {

    public Time() {
        EventQueue.invokeLater(() -> {
            //<codeInQuestion>
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                ex.printStackTrace();
            }

            JFrame frame = new JFrame("Testing");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            //</codeInQuestion>

            ActionListener taskPerformer = new ActionListener() {
                int testCount = 0;

                public void actionPerformed(ActionEvent evt) {
                    System.out.println("Time passed: " + testCount);
                    testCount++;
                }
            };
            Timer timer = new Timer(1000, taskPerformer);
            timer.start();
        });
    }
}


主要:

    public class Main {
    public static void main(String[] args) {
        Time timer = new Time();
    }
}

最佳答案

程序会自行停止所有值小于900的值。


只有启动了事件调度线程,该应用程序才会继续运行。

由于您不会使框架可见,因此没有理由让GUI继续执行。

TImer触发时会在EDT上放置事件。对于
您的CIQ还必须向EDT添加一些事件,以防止GUI关闭。

08-16 14:12