我正在组合一个幻灯片显示程序,该程序将测量用户在每张幻灯片上花费的时间。幻灯片显示了几种不同的魔术。每个技巧显示两次。在重复之间显示了临时图像。在每个技巧之间显示过渡图像。
在第一次重复播放花样时,单击后,JPanel颜色在屏幕上闪烁,然后显示下一张图像。在相同技巧的第二次重复过程中不会发生这种情况。图片加载时间过长。
是否有一种简单的方法来预加载图像,以使第一次通过时没有延迟?
NOTE: Original code deleted.
编辑1/10/2013:现在,此代码可在速度较慢的计算机上使用。废纸go的第二个附录最大的帮助。mouseClick控件结构会定期要求SwingWorker类加载40个或更少的当前技巧图像,同时还将使用的图像设置为null。为此,我已将代码简化为仅两个Image
[],并添加了main方法,因此它独立存在。图像仍然需要运行。现在这是非常简单的代码,如果您要制作包含很多图像的幻灯片,我认为这是一个不错的起点。
注意:我想我想出了如何在仍然使用多个Image
[]的情况下正确实现SwingWorker。垃圾桶和kleopatra的实现是否符合您的建议?我最终没有使用发布和处理,因为我无法弄清楚如何使它与索引数组一起正常工作,而是因为StringWorker不会加载数组中的所有图像(仅加载40个),并且代码每20张图片调用一次StringWorker,应该有一个不错的缓冲区。
编辑2013年1月10日,改为通过在我的Mouse类上扩展MouseAdapter来更改MouseListener。还修复了我的paintComponent方法,以包括对super.paintComponent(g)的调用。在我的SwingWorker类ImageWorker中添加了发布/处理方法。添加了一个包装器类ArrayWrapper,以允许将imageArray
[i]及其对应的索引int i与publish一起进行处理。
package slideshow3;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import java.util.List;
public class SlideShow3 extends JFrame
{
//screenImage will be replaced with each new slide
private Image screenImage;
private int width;
private int height;
//Create panel for displaying images using paintComponent()
private SlideShow3.PaintPanel mainImagePanel;
//Used for keybinding
private Action escapeAction;
//Image array variables for each trick
private Image[] handCuffs; //h
private Image[] cups; //c
//Used to step through the trick arrays one image at a time
private int h = 0;
private int c = 0;
//Used by timeStamp() for documenting time per slide
private long time0 = 0;
private long time1;
public SlideShow3()
{
super();
//Create instance of each Image array
handCuffs = new Image[50];
cups = new Image[176];
//start(handCuffsString);
start("handCuffs");
try
{
screenImage = ImageIO.read(new File("images/begin1.jpg"));
}
catch (IOException nm)
{
System.out.println("begin");
System.out.println(nm.getMessage());
System.exit(0);
}
/******************************************
* Removes window framing. The next line sets fullscreen mode.
* Once fullscreen is set width and height are determined for the window
******************************************/
this.setUndecorated(true);
GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().setFullScreenWindow(this);
width = this.getWidth();
height = this.getHeight();
//Mouse click binding to slide advance control structure
addMouseListener(new Mouse());
//Create panel so that I can use key binding which requires JComponent
mainImagePanel = new PaintPanel();
add(mainImagePanel);
/******************************************
* Key Binding
* ESC will exit the slideshow
******************************************/
// Key bound AbstractAction items
escapeAction = new EscapeAction();
// Gets the mainImagePanel InputMap and pairs the key to the action
mainImagePanel.getInputMap().put(KeyStroke.getKeyStroke("ESCAPE"), "doEscapeAction");
// This line pairs the AbstractAction enterAction to the action "doEnterAction"
mainImagePanel.getActionMap().put("doEscapeAction", escapeAction);
/******************************************
* End Key Binding
******************************************/
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run()
{
SlideShow3 show = new SlideShow3();
show.setVisible(true);
}
});
}
//This method executes a specific SwingWorker class to preload images
public void start(String e)
{
if(e.equals("handCuffs"))
{
new ImageWorker(handCuffs.length, h, e).execute();
}
else if(e.equals("cups"))
{
new ImageWorker(cups.length, c, e).execute();
}
}
//Stretches and displays images in fullscreen window
private class PaintPanel extends JPanel
{
@Override
public void paintComponent(Graphics g)
{
if(screenImage != null)
{
super.paintComponent(g);
g.drawImage(screenImage, 0, 0, width, height, this);
}
}
}
/******************************************
* The following SwingWorker class Pre-loads all necessary images.
******************************************/
private class ArrayWrapper
{
private int i;
private Image image;
public ArrayWrapper(Image image, int i)
{
this.i = i;
this.image = image;
}
public int getIndex()
{
return i;
}
public Image getImage()
{
return image;
}
}
private class ImageWorker extends SwingWorker<Image[], ArrayWrapper>
{
private int currentPosition;
private int arraySize;
private String trickName;
private Image[] imageArray;
public ImageWorker(int arraySize, int currentPosition, String trick)
{
super();
this.currentPosition = currentPosition;
this.arraySize = arraySize;
this.trickName = trick;
}
@Override
public Image[] doInBackground()
{
imageArray = new Image[arraySize];
for(int i = currentPosition; i < currentPosition+40 && i < arraySize; i++)
{
try
{
imageArray[i] = ImageIO.read(new File("images/" + trickName + (i+1) + ".jpg"));
ArrayWrapper wrapArray = new ArrayWrapper(imageArray[i], i);
publish(wrapArray);
}
catch (IOException e)
{
System.out.println(trickName);
System.out.println(e.getMessage());
System.exit(0);
}
}
return imageArray;
}
@Override
public void process(List<ArrayWrapper> chunks)
{
for(ArrayWrapper element: chunks)
{
if(trickName.equals("handCuffs"))
{
handCuffs[element.getIndex()] = element.getImage();
}
else if(trickName.equals("cups"))
{
cups[element.getIndex()] = element.getImage();
}
}
}
@Override
public void done()
{
try
{
if(trickName.equals("handCuffs"))
{
handCuffs = get();
}
else if(trickName.equals("cups"))
{
cups = get();
}
}
catch(InterruptedException ignore){}
catch(java.util.concurrent.ExecutionException e)
{
String why = null;
Throwable cause = e.getCause();
if(cause != null)
{
why = cause.getMessage();
}
else
{
why = e.getMessage();
}
System.err.println("Error retrieving file: " + why);
}
}
}
/******************************************
* End SwingWorker Pre-Loading Classes
******************************************/
//Prints out time spent on each slide
public void timeStamp()
{
time1 = System.currentTimeMillis();
if(time0 != 0)
{
System.out.println(time1 - time0);
}
time0 = System.currentTimeMillis();
}
/******************************************
* User Input Classes for Key Binding Actions and Mouse Click Actions
******************************************/
private class EscapeAction extends AbstractAction
{
@Override
public void actionPerformed(ActionEvent e)
{
System.exit(0);
}
}
public class Mouse extends MouseAdapter
{
@Override
public void mouseClicked(MouseEvent e)
{
if(!(h<handCuffs.length) && !(c<cups.length))
{
timeStamp();
System.exit(0);
}
else if(h<handCuffs.length)
{
timeStamp();
screenImage = handCuffs[h];
repaint();
System.out.print("handCuffs[" + (h+1) + "]\t");
h++;
//purge used slides and refresh slide buffer
if(h == 20 || h == 40)
{
for(int i = 0; i < h; i++)
{
handCuffs[i] = null;
}
start("handCuffs");
}
if(h == 45)
{
start("cups");
}
}
else if(c<cups.length)
{
timeStamp();
screenImage = cups[c];
repaint();
System.out.print("cups[" + (c+1) + "]\t");
c++;
//purge used slides and refresh slide buffer
if(c == 20 || c == 40 || c == 60 || c == 80 || c == 100 || c == 120 || c == 140 || c == 160)
{
for(int i = 0; i < c; i++)
{
cups[i] = null;
}
start("cups");
}
}
}
}
/******************************************
* End User Input Classes for Key Binding Actions and Mouse Click Actions
******************************************/
}
本示例使用a
List<ImageIcon>
作为cache
由返回的图像getImage()
。使用getResource()
,延迟是无法察觉的。Space
默认情况下,下一个和上一个按钮绑定到该键。
附录:您可以通过调节控制导航按钮的setEnabled()
使用实例的状态javax.swing.Timer
,为例子。
附录:您的第二个例子中等待,直到单击鼠标时,开始读取图像,不确定的过程,可能会立即html" target="_blank">返回副本或可能 不会 完成,直到 后
repaint()
。取而代之的是,在开始使用背景读取图像ImageIO.read()
,如图所示这里。您可以process()
您List<Image>
,并显示进度,看到这里。在SwingWorker
从启动初始线程,运行时您随后建立你的EDT
GUI。您可以在处理完第一张图像后立即显示它。
我们目前正在一个网站上使用全屏图像幻灯片,初始测试非常有效,下面的代码显示了它的工作原理: 我们要做的是从CSM动态地写入图像。我现在做的是列出一个简单的列表,如下所示: 我们需要做的是获取此图像列表并将其注入到$.vegas backgrounds:[]函数列表中。。。 我已经尝试了下面的代码,可以得到图像列表,但我不确定您将如何将其放入$. vegas函数: 因此,这里的职位。非常感谢您的帮助
使用幻灯片组件,你需要在 sm.js 和 sm.css 之后额外引入如下两个文件: <link rel="stylesheet" href="//g.alicdn.com/msui/sm/0.6.2/css/sm-extend.min.css"> <script type='text/javascript' src='//g.alicdn.com/msui/sm/0.6.2/js/sm-exte
我正在尝试用Java编写一个幻灯片放映程序,并希望使实现尽可能简单。 目标是显示一系列幻灯片,每个幻灯片都有导航按钮,此外还有依赖于幻灯片内容的其他按钮。(显示文本的幻灯片将有,而带有图像的幻灯片将没有此按钮。)
Progress,进度条,用于上传、下载等耗时并且需要显示进度的场景,用户可以随时中断该操作。在mpvue框架中实现这个功能是基于小程序的原生progress 组件,这里主要说一下它percent属性: percent 类型:Float 默认值:无 可选值:0-100 说明:百分比0~100 要实现上传或者下载过程中显示进度的效果,就需要实时修改 percent属性的值,下面示例代码是每隔 20m
幻灯片秀 自动依顺序显示每张图像。 播放幻灯片秀 同时播放音乐与幻灯片秀 使用操作接口 利用PSP™主机的按钮或线控装置进行操作
本文向大家介绍使用impress.js制作幻灯片,包括了使用impress.js制作幻灯片的使用技巧和注意事项,需要的朋友参考一下 上周看到一个朋友做了很炫的缩放式幻灯片,可能因为对此知识了解的不多,找了好久才找到几个web幻灯片工具。通过筛选决定用Geek的 impress.js 。 impress.js是一款新兴的幻灯工具,它的效果类似Prezi,但是拥有3D的功能,而且是在MIT&GPL协议