这就是我想做的 - 长话短说: 构建一个窗口(将称为主窗口),顶部有按钮,中间有一张图片。我想为用户提供选择要执行的操作(按钮)的选项,同时每隔几秒更改一次中心图片。提供给用户的部分选项是“暂停”和“恢复” - 控制顺序。 基本上尝试通过线程更新 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;
}
}
最佳答案
- 不要为此直接使用线程。没有必要,如果您在后台线程中调用不小心更改 Swing 状态的代码,则会带来风险。
- 为动画循环使用 Swing 计时器。
- 在 JLabel 中将图像显示为 ImageIcons。
- 代码的主要问题之一是您不断创建一堆不必要且危险的新 JLabel。一个 JLabel 即可满足您的所有需求和需求。因此,只需创建一次显示 JLabel 的图像,然后通过其
setIcon(...)
方法交换图标。 - 只需读入图像 Icon 一次,然后将其保存在变量或集合中。
- 您只需调用 Swing 计时器的
stop()
方法即可轻松暂停它,也可通过调用start()
轻松重新启动它。
关于java - 在java中通过线程显示图像序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23686177/