【问题标题】:Alternating images with a timer using java使用java使用计时器交替图像
【发布时间】:2011-03-03 10:37:07
【问题描述】:

由于我不是 CS 专业的,我在将我的编程愿望转化为实际程序时遇到了一些困难。 它基本上归结为以下内容:如何在标签上交替显示图像,以特定于每个图像的时间显示每个图像。

所以:假设我有图像 A 和 B;我希望用户在 1000 毫秒内看到 A,在 200 毫秒内看到 B。这会一直循环,直到用户按下某个键。

现在,我甚至可以很轻松地将图像加载到面板上,并且我已经设法使用 KeyListener 和其他东西来捕捉用户输入,这一切都非常好,而且比我预期的要容易得多。我也知道如何使用循环结构,如 while、for 和 do..while,但这个计时器业务是阴暗的。

我看到各种使用线程的东西,什么不是,我真的不需要。这不是关于高效的编程或好的代码,它只是为了展示一些东西。 任何帮助将不胜感激!

【问题讨论】:

  • 我能想到许多 CS 专业的学生很难将他们的编程愿望转化为实际的程序 - 不要让这让你有丝毫的沮丧。

标签: java image loops timer alternate


【解决方案1】:

使用SwingWorker<Void, Void>。 SwingWorker 的 doInBackground 方法应如下所示:

@Override
protected Void doInBackground() {
    try {
        while (true) {
            displayImage(imageA);
            Thread.sleep(1000L);
            if (isCancelled()) {
                return null;
            }
            displayImage(imageB);
            Thread.sleep(200L);
            if (isCancelled()) {
                return null;
            }
        }
    }
    catch (InterruptedException e) {
        // ignore
    }
    return null;
}

private void displayImage(final Icon image) {
    SwingUtilituies.invokeLater(new Runnable() {
        @Override
        public void run() {
            // display the image in the panel
        }
    });
}

keylistener 应该简单地取消 SwingWorker。

【讨论】:

  • 我明白了,我没有听说过 SwingWorker,我现在正在研究这个。谢谢。
  • 有些我不明白。我的班级扩展了 SwingWorker。我已经覆盖了 doInBackground() 并按照您描述的方式实现了 displayImage 方法。在我的构造函数中,我正在创建一个带有 JLabel 的 JFrame,加载一些图像并调用 this.execute();,唉,似乎什么也没发生。我得到了框架,但没有更多。我在这里错过了什么?
【解决方案2】:

这可能是一个很好的例子: http://www.java2s.com/Code/Java/Development-Class/UsejavautilTimertoscheduleatasktoexecuteonce5secondshavepassed.htm

如果代码看起来令人困惑,我可以尝试解释一下

【讨论】:

    【解决方案3】:

    当线程是完成工作的正确工具时,使用线程并没有必然的低效。

    在这种情况下,创建一个实现Runnable 的新类并非不合理,它包含对您希望更改图像的标签的引用。

    这意味着可以更改图像而不会导致主应用程序等待导致其挂起直到完成。

    您会想要避免“繁忙循环”[基本上,一个没有 Thread.sleep() 的 while 循环],并查看是否有任何需要的线程退出条件

    【讨论】:

    • 我并不是说任何事情都是低效的;我说我不是在寻找效率。只是学习使用线程真的超出了我在这里想要完成的工作的范围:一些视觉辅助(e?)用于我正在采取的实验心理学课程中的实验,作为神经病学的回避。所以,基本上,任何花哨的东西都太多了。干净的代码或设计模式并不重要,它只需要运行一次,之后它就会被扔掉嘿嘿当然除非线程是必要的,否则我会避免额外的工作量;)
    • 但是,我会研究 Runnable 等,因为这似乎是避免我的应用程序“挂起”的唯一方法。这意味着它不会响应按键,对吧?
    • 了解 Runnables 是个好主意,正确使用确实可以防止它对按键不响应。不过,在这种情况下,JB Nizet 的 SwingWorker 看起来是一个更好的起点
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多