在使用JWebBrower 生成图片时,一次生成很多个,非常耗时,同时第一次根据前台调用生成图片,一直没有返回消息,debug一次发现方法一直停留在NativeInterface.runEventPump();处。求大神给解答下,不胜感激!
public static void takeSnapshot2(final List<Map<String,String>> xllist,final List<Map<String,String>> llist) {
if(!NativeInterface.isOpen()){
NativeInterface.open();
}
SwingUtilities.invokeLater(new Runnable()
{
@SuppressWarnings("unchecked")
public void run()
{
Iterator it = xllist.iterator();
while(it.hasNext()){
Map<String,String> map = (Map<String,String>) it.next();
new ZpToImage(map.get("url"),map.get("fileName"),0,0, 0,50);
}
xllist.clear();
}
});
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
Iterator it = llist.iterator();
while(it.hasNext()){
Map<String,String> map = (Map<String,String>) it.next();
new ZpToImage(map.get("url"),map.get("fileName"),16,0, 16, 65);
}
llist.clear();
}
});
//NativeInterface.runEventPump();
if (!NativeInterface.isEventPumpRunning()) {
try{
//NativeInterface.close() ;
//第一次调用时,最后程序的进度一直在此处。debug跳不过去了,也没有异常。
NativeInterface.runEventPump();
}catch(Exception e){
e.printStackTrace() ;
}
}
}
public ZpToImage(String url,final String fileName, final int x, final int y,final int adjustWidth, final int adjustHeight)
{
final StringBuffer jsDimension = new StringBuffer();
//......
JPanel mainPanel = new JPanel(new BorderLayout());
JPanel webBrowserPanel = new JPanel(new BorderLayout());
// final String fileName = "E:/upload/"+System.currentTimeMillis() + ".jpg";
final JWebBrowser webBrowser = new JWebBrowser(null);
webBrowser.setBarsVisible(false);
webBrowser.navigate(url);
webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
mainPanel.add(webBrowserPanel, BorderLayout.CENTER);
JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));
webBrowser.addWebBrowserListener(new WebBrowserAdapter()
{
// 监听加载进度
public void loadingProgressChanged(WebBrowserEvent e)
{
// 当加载完毕时
if (e.getWebBrowser().getLoadingProgress() == 100)
{
/* String c = webBrowser.getHTMLContent();
System.out.println("========"+webBrowser.getHTMLContent());*/
String result = (String) webBrowser.executeJavascriptWithResult(jsDimension.toString());
System.out.println(result);
int index = result == null ? -1 : result.indexOf(":");
NativeComponent nativeComponent = webBrowser.getNativeComponent();
Dimension originalSize = nativeComponent.getSize();
Dimension imageSize = null;
if(result == null){
imageSize = new Dimension(800,640);
}else{
imageSize = new Dimension(Integer.parseInt(result.substring(0, index)), Integer
.parseInt(result.substring(index + 1)));
}
//Dimension imageSize = new Dimension(1250,1250);
imageSize.width = Math.max(originalSize.width, imageSize.width + 50);
imageSize.height = Math.max(originalSize.height, imageSize.height + 50);
nativeComponent.setSize(imageSize);
BufferedImage image = new BufferedImage(imageSize.width, imageSize.height,
BufferedImage.TYPE_INT_RGB);
nativeComponent.paintComponent(image);
nativeComponent.setSize(originalSize);
System.out.println(imageSize.width+"==="+imageSize.height);
// 当网页超出目标大小时
image = image.getSubimage(x, y, imageSize.width-adjustWidth-x, imageSize.height-adjustHeight-y);
try
{
File file = new File(fileName);
System.out.println("======"+file.getPath());
// 输出图像
ImageIO.write(image, "jpg", file);
} catch (IOException ex)
{
ex.printStackTrace();
}
//System.exit(0);
// 退出操作
dispose();
}
}
});
mainPanel.add(panel, BorderLayout.SOUTH);
getContentPane().add(mainPanel, BorderLayout.CENTER);
setSize(800, 600);
invalidate();
pack();
setVisible(false);
}