java - 使用 JFrame 的图像幻灯片
问题描述
我有一个似乎很容易的任务的问题。我必须创建一个程序来连续显示图像(.jpg、.png 和 .gif)。图像必须是某些文件的内容,作为程序的参数给出。当我必须单独加载图像时,它可以工作,但是当我一个接一个地加载它们并在它们之间进行睡眠时会出现问题。
这是我的代码:
import javax.swing.SwingUtilities;
public class Main {
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run()
{
new MyFrame(args[0],Integer.parseInt(args[1]));
//First argument is path to file with images, second - amount of time (in seconds) which every image has to stay on the screen until the next one appears
}
});
}
}
import java.io.File;
import javax.swing.*;
public class MyFrame extends JFrame{
public MyFrame(String path, int time){
super("Obrazki");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setVisible(true);
MyPanel panel = new MyPanel();
panel.setVisible(true);
this.add(panel);
pack();
File file = new File(path);
String[] tabs = file.list();
for(int i=0; i<tabs.length; i++)
{
panel.loadImage(path+"\\"+tabs[i]);
this.repaint();
try {
Thread.sleep(time*1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;
import javax.swing.JPanel;
public class MyPanel extends JPanel
{
Image img;
public void loadImage(String s)
{
img = Toolkit.getDefaultToolkit().getImage(s);
MediaTracker tracker = new MediaTracker(this);
tracker.addImage(img, 1);
while(!tracker.checkID(1)) {
try {
tracker.waitForID(1);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
this.repaint();
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
g2.drawImage(this.img, 0, 0, this.getSize().width, this.getSize().height, this);
}
}
解决方案
但问题是当我一个接一个地加载它们时,它们之间有睡眠时间。
您正在导致Event Dispatch Thread (EDT)
睡眠,这意味着 GUI 无法响应事件或重新绘制自身。阅读 Swing 教程中关于并发的部分以获取更多信息。
当代码在EDT
.
对于动画,您可以:
- 使用
SwingWorker
(with Thread.sleep()) 并发布你想要绘制的图标,或者 - 使用摆动计时器。本教程还有一个关于
How to Use Swing Timers
.
推荐阅读
- javascript - Ajax同步post方法,从Node服务器端获取数据
- bash - 每次重启 AWS EC2 实例时执行脚本
- c# - 我遇到关于“Expr1000”的错误
- reactjs - 在 ReactJS 中路由后从子组件获取值
- oracle - PL/SQL 异常未捕获异常
- android - 在两个顺序 addToBackStack 之后,supportFragmentManager.fragments 大小为 1
- unity3d - 如何统一导出带有mtl文件的obj文件?
- java - 方法参考中的错误返回类型:无法将 reactor.core.publisher.Mono 转换
为 reactor.core.publisher.Mono - node.js - VSCode 收集扩展错误 -4094 - 这是什么意思?
- r - summary_at 用于 R 中具有不同参数的多个变量和多个函数?