java - 在java中通过线程显示图像序列

标签 java multithreading image swing user-interface

这就是我想做的 - 长话短说: 构建一个窗口(将称为主窗口),顶部有按钮,中间有一张图片。我想为用户提供选择要执行的操作(按钮)的选项,同时每隔几秒更改一次中心图片。提供给用户的部分选项是“暂停”和“恢复” - 控制顺序。 基本上尝试通过线程更新 GUI(主窗口)。当 boolean 值“playSequence”为真时,该线程将运行。

有人可以解释一下为什么我不能让它工作吗?

代码如下:

package SpecializedControls;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingWorker;
import DataEntities.SgiImage;

public class SgiImagePanel extends JPanel implements Runnable {
private List<SgiImage> seqImageList;
private JLabel lastImage;
private boolean playSequence;

public SgiImagePanel (){}

public SgiImagePanel (List<SgiImage> sequenceList)
{
seqImageList = sequenceList ;
}


@Override
public void run() {
    // TODO Auto-generated method stub

    while(playSequence)
    {
        for (SgiImage image : seqImageList) 
        {
            display(image);
            try {
                Thread.sleep(3000);
                } 
            catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                }
        }
    }       
}

public void display(SgiImage image)
{
    reset();
    JLabel picLabel = new JLabel(new ImageIcon(image.getImage())); 
    add(picLabel); 
    lastImage = picLabel;
}

public void display(List<SgiImage> sequenceList)
{   
    if(sequenceList==null)
        return;

    playSequence = true;
    SgiImagePanel seq = new SgiImagePanel(sequenceList);        
    Thread thread = new Thread(seq);
    thread.start();

}

public void reset(){
    if (lastImage != null)
    {
        remove(lastImage);
        lastImage = null;
    }
}

public void pause() {
    playSequence = false;
}

public void resume(){
    playSequence = true;
}


}

最佳答案

  1. 不要为此直接使用线程。没有必要,如果您在后台线程中调用不小心更改 Swing 状态的代码,则会带来风险。
  2. 为动画循环使用 Swing 计时器。
  3. 在 JLabel 中将图像显示为 ImageIcons。
  4. 代码的主要问题之一是您不断创建一堆不必要且危险的新 JLabel。一个 JLabel 即可满足您的所有需求和需求。因此,只需创建一次显示 JLabel 的图像,然后通过其 setIcon(...) 方法交换图标。
  5. 只需读入图像 Icon 一次,然后将其保存在变量或集合中。
  6. 您只需调用 Swing 计时器的 stop() 方法即可轻松暂停它,也可通过调用 start() 轻松重新启动它。

关于java - 在java中通过线程显示图像序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686177/

相关文章:

java - EntityManagerFactory 中实体管理器的正确使用

java - doPost 和 getParameter()

java - 使用 java 代码清理 JBoss 7 tmp

Thread.sleep() 的 Java 性能问题

python - 是否可以从与创建进程的线程不同的线程等待子进程?

java - 所有 web 应用程序的 tomcat 过滤器

css - 这个数据css是什么?

php - 只有少数 CSS 和图像未加载

algorithm - 从原始图像中加入拼图

iphone - 线程正在被操作系统杀死