J2SE 异步更新窗口的数据源

十八道胡同 2013-09-05 10:47:52
我的窗口需要显示14个页面的缩略图,但是生成一个缩略图大于需要2s,我不希望用户一直等待14*2=28s之后才开始给用户看这些缩略图,我打算这样:
1,生成5个缩略图的时候窗口显示出来,此时用户可以看到5个缩略图
2,等用户在看前5个缩略图时,后面接着生成其他的缩略图,且推送新生成的缩略图给窗口。

我现在的做法是:
	
int index = 1;
while (!donePrinting(index)) {
image = getPage(index);
if (image != null) {
saveImage(image, index);
image.flush();
image = null;
}
if (allImages.size() >= 5) {

try {
dialog = new BookPreviewUsingPics(allImages, getNumOfPages());
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}

final int realIndex = index + 1;
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
getLeftImages(realIndex);
}
});

return;
}
index++;
}


	private void getLeftImages(int index) {
System.out.println("Start to getLastImages from index :" + index);
BufferedImage image = null;
while (!donePrinting(index)) {
image = getPage(index);
if (image != null) {
saveImageAndSend(image, index);
image.flush();
image = null;
}
index++;
}

image = getBackCoverPage();
if (image != null)
saveImageAndSend(image, getNumOfPages() + 1);
}

private void saveImageAndSend(BufferedImage image, int i) {
System.out.println("Start to saveImageAndSend for index :" + i + " image :" + image);
HashMap<Integer, BufferedImage> images = new HashMap<Integer, BufferedImage>();
images.put(i, image);
if (dialog != null) {
System.out.println("--> Start to sendBufferedImage for index :" + i);
dialog.sendBufferedImage(images);
}
}


但是这样的话,窗口刚起来时,点击窗口没有反应,只有等14个页面全部生成了,窗口才响应了用户的点击事件,请问各位,你们知道是什么原因吗?该如何修改啊!
...全文
182 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
十八道胡同 2013-09-06
  • 打赏
  • 举报
回复
引用 9 楼 fangmingshijie 的回复:
木有,没有具体的例子。
目前11楼的方法可以解决这个问题。 优化时 我打算试一下您说的方法。谢谢你的建议
十八道胡同 2013-09-06
  • 打赏
  • 举报
回复
引用 10 楼 huntor 的回复:
[quote=引用 5 楼 LCL_data 的回复:] [quote=引用 2 楼 huntor 的回复:] 使用SwingWorker
你的意思是 用他来生成缩略图?[/quote] 是。 doInBackground 方法里生成缩略图,done方法里设置显示图片[/quote] 我记得done是在doInBackground 全部执行完了之后在执行,我现在在doInBackground 里面pulish,在process里面是设置显示的图片。这个不会有卡吨的现象。
十八道胡同 2013-09-06
  • 打赏
  • 举报
回复
引用 13 楼 huntor 的回复:
[quote=引用 11 楼 LCL_data 的回复:] [quote=引用 10 楼 huntor 的回复:] [quote=引用 5 楼 LCL_data 的回复:] [quote=引用 2 楼 huntor 的回复:] 使用SwingWorker
你的意思是 用他来生成缩略图?[/quote] 是。 doInBackground 方法里生成缩略图,done方法里设置显示图片[/quote] 我记得done是在doInBackground 全部执行完了之后在执行,我现在在doInBackground 里面pulish,在process里面是设置显示的图片。这个不会有卡吨的现象。[/quote] 我意思是一个缩略图使用一个SwingWorker,你是一个SwingWorker生成所有缩略图?[/quote] 那理解错你的意思了。 我是前5个是还是我之前的办法,后面的全部放到一个Swingworker里面来生成。 一个缩略图一个SwingWorker也是个好办法
huntor 2013-09-06
  • 打赏
  • 举报
回复
引用 11 楼 LCL_data 的回复:
[quote=引用 10 楼 huntor 的回复:] [quote=引用 5 楼 LCL_data 的回复:] [quote=引用 2 楼 huntor 的回复:] 使用SwingWorker
你的意思是 用他来生成缩略图?[/quote] 是。 doInBackground 方法里生成缩略图,done方法里设置显示图片[/quote] 我记得done是在doInBackground 全部执行完了之后在执行,我现在在doInBackground 里面pulish,在process里面是设置显示的图片。这个不会有卡吨的现象。[/quote] 我意思是一个缩略图使用一个SwingWorker,你是一个SwingWorker生成所有缩略图?
huntor 2013-09-05
  • 打赏
  • 举报
回复
使用SwingWorker
十八道胡同 2013-09-05
  • 打赏
  • 举报
回复
这个是dialog的sendBufferedImage方法:
	public void sendBufferedImage(final HashMap<Integer, BufferedImage> allImages) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				allBufferedImages.putAll(allImages);
				System.out.println("Total num of allBufferedImages in JBookPanel is " + allBufferedImages.size());
			}
		});		
		
		
	}
huntor 2013-09-05
  • 打赏
  • 举报
回复
引用 5 楼 LCL_data 的回复:
[quote=引用 2 楼 huntor 的回复:] 使用SwingWorker
你的意思是 用他来生成缩略图?[/quote] 是。 doInBackground 方法里生成缩略图,done方法里设置显示图片
  • 打赏
  • 举报
回复
木有,没有具体的例子。
十八道胡同 2013-09-05
  • 打赏
  • 举报
回复
引用 6 楼 fangmingshijie 的回复:
[quote=引用 4 楼 LCL_data 的回复:] [quote=引用 3 楼 fangmingshijie 的回复:] 你图片显示不是并行的吗?应该做成多线程式的。互相之间不影响。
图片显示时,直接从allBufferedImages里面获得BufferedImage,然后显示。多线程显示图片? panel能支持吗?[/quote]布局定义好,当然支持了。[/quote] 你那里有实例吗?我参考下
十八道胡同 2013-09-05
  • 打赏
  • 举报
回复
引用 6 楼 fangmingshijie 的回复:
[quote=引用 4 楼 LCL_data 的回复:] [quote=引用 3 楼 fangmingshijie 的回复:] 你图片显示不是并行的吗?应该做成多线程式的。互相之间不影响。
图片显示时,直接从allBufferedImages里面获得BufferedImage,然后显示。多线程显示图片? panel能支持吗?[/quote]布局定义好,当然支持了。[/quote] 好的,我调查下。
  • 打赏
  • 举报
回复
引用 4 楼 LCL_data 的回复:
[quote=引用 3 楼 fangmingshijie 的回复:] 你图片显示不是并行的吗?应该做成多线程式的。互相之间不影响。
图片显示时,直接从allBufferedImages里面获得BufferedImage,然后显示。多线程显示图片? panel能支持吗?[/quote]布局定义好,当然支持了。
十八道胡同 2013-09-05
  • 打赏
  • 举报
回复
引用 2 楼 huntor 的回复:
使用SwingWorker
你的意思是 用他来生成缩略图?
十八道胡同 2013-09-05
  • 打赏
  • 举报
回复
引用 3 楼 fangmingshijie 的回复:
你图片显示不是并行的吗?应该做成多线程式的。互相之间不影响。
图片显示时,直接从allBufferedImages里面获得BufferedImage,然后显示。多线程显示图片? panel能支持吗?
  • 打赏
  • 举报
回复
你图片显示不是并行的吗?应该做成多线程式的。互相之间不影响。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧