异常求助!

xxyes 2012-08-30 09:59:29
Exception in thread "main" java.lang.IllegalStateException: This call must happen in the AWT Event Dispatch Thread! Please refer to http://java.sun.com/docs/books/tutorial/uiswing/concurrency/index.html and http://java.sun.com/javase/6/docs/api/javax/swing/SwingUtilities.html#invokeLater(java.lang.Runnable)
at chrriis.dj.nativeswing.swtimpl.MessagingInterface.checkUIThread(MessagingInterface.java:155)
at chrriis.dj.nativeswing.swtimpl.NativeInterface.checkUIThread(NativeInterface.java:368)
at chrriis.dj.nativeswing.swtimpl.NativeComponent.runSync(NativeComponent.java:131)
at chrriis.dj.nativeswing.swtimpl.components.NativeWebBrowser.navigate(NativeWebBrowser.java:653)
at chrriis.dj.nativeswing.swtimpl.components.JWebBrowser.navigate(JWebBrowser.java:295)
at chrriis.dj.nativeswing.swtimpl.components.JWebBrowser.navigate(JWebBrowser.java:285)
at xx.shapshot.Jar3XML.<init>(Jar3XML.java:117)
at xx.shapshot.Shapshot.shapshot(Shapshot.java:6)
at xx.test.TestShapshopXml.main(TestShapshopXml.java:7)


当这个方法连着调用两次时,就出上述异常
new Jar3XML().shapshot();
new Jar3XML().shapshot();

public class Jar3XML extends JPanel {
//略……
public Jar3XML() {
super(new BorderLayout());
final JWebBrowser webBrowser = new JWebBrowser(null);
//略……
}
public static void shapshot() {

run() {
//略……
}

}

}
...全文
605 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
mingyue168 2014-04-18
  • 打赏
  • 举报
回复
楼主看看这个怎么解决:http://bbs.csdn.net/topics/390763662
xxyes 2012-09-03
  • 打赏
  • 举报
回复
解决了
main中这样写

NativeInterface.open();

SwingUtilities.invokeLater(new Runnable() {

public void run() {
Shapshot.shapshot("http://www.baidu.com", 1);
}
});
NativeInterface.runEventPump();

servlet中这样写



srcUrl = request.getParameter("srcurl");
method = Integer.parseInt(request.getParameter("method"));
HttpSession session = request.getSession();
NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
rePath = Shapshot.shapshot(srcUrl, method);
}
});
// NativeInterface.runEventPump();
session.setAttribute("repath", rePath);
response.sendRedirect("ok.jsp");
MiceRice 2012-08-31
  • 打赏
  • 举报
回复
把这几个操作快照的动作,独立封装为静态函数并强制同步试试看了:
public static synchronized 返回值 takeSnapshot() {
NativeInterface.open();
try {
return Shapshot.shapshot();
} finally {
NativeInterface.runEventPump();
}
}
xxyes 2012-08-31
  • 打赏
  • 举报
回复
另外,这个JWebBrowaser关于快照,有没有时间差限制,也就是快照本身可能是异步的,如果连续调用会出错,但如果等到前一次快照完毕后,再调用下一次,是否就可以了?

这个方法是最后的机会了。。
经测试,JWebBrowaser确实是异步的,求大神给点方向……

另外这方法写出来就是用来调用的啊!!总不至于总在main里写线程吧~~~真心搞不懂

网上找遍了,遇到这问题的貌似都没解决,剩下的就是没遇到这问题的。。
MiceRice 2012-08-31
  • 打赏
  • 举报
回复
这个有点麻烦了,相当于是 NativeInterface 可能是不支持并发的。

另外,NativeInterface.runEventPump(); 必须放在 finally 里面,确保执行。否则你一个return就跳过去了。

xxyes 2012-08-31
  • 打赏
  • 举报
回复
public static void main(String[] args) {


NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {

public void run() {
// TODO Auto-generated method stub
Shapshot.shapshot();
Shapshot.shapshot();
}
});
NativeInterface.runEventPump();


}

这样不会报错,并且成功截取2次

// Shapshot.shapshot();这个怎么能够调用!!!! 愁啊


servlet 中这样写
{
NativeInterface.open();
Shapshot.shapshot();
response.sendRedirect("ok.jsp");
NativeInterface.runEventPump();
}
或者这样写
{
NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Shapshot.shapshot();
try {
response.sendRedirect("ok.jsp");
return;
} catch (IOException e) {
e.printStackTrace();
}
}
});
NativeInterface.runEventPump();
}

都是同一个错
Exception in thread "main" java.lang.IllegalStateException: runEventPump was already called and can only be called once (the first call should be at the end of the main method)!
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
图形界面中,不是所有的线程都可以随意去操纵控件的,这个并发控制的难度很高,所以基本上所有的图形系统,都只有 1个主GUI线程 负责控制所有的控件和事件。

Google下 invokeLater 的样例,学习下就大概知道意思了。
xxyes 2012-08-30
  • 打赏
  • 举报
回复
SwingUtilities.invokeLater 不知道
主GUI线程 不知道
毁掉方式 不知道

从何下手 迷茫
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
意思是你不能用 主GUI线程以外的线程来调用该方法。

建议你用:SwingUtilities.invokeLater 来借助主GUI线程,通过回调的方式间接调用该方法。
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
可能得换个思路来试试看。

如果你不要中间件,直接用普通的J2SE的GUI程序,来调用这个JWebBrowaser,进行快照,能连续调用么?

另外,这个JWebBrowaser关于快照,有没有时间差限制,也就是快照本身可能是异步的,如果连续调用会出错,但如果等到前一次快照完毕后,再调用下一次,是否就可以了?


最后如果还没招,也许就的考虑换个做页面快照的组件了。。。



其实,搜索引擎的快照,并不保存图片,它只是稍微完整点下载了HTML和CSS的内容而已。
xxyes 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

对你的应用场景感觉到很奇怪,你这个网页快照的程序,是在Tomcat这端运行的,能截取哪里的网页呢?

另外就是,尝试不要重复创建 JWebBrowaser,而是使用用一个对象来做这个事情了。
[/Quote]

就是放服务器上啊,就好像某些网站上的网页快照一样。

servlet 请求很蛋疼啊,没有方法啊,没有方法啊~~

public void service(HttpServletRequest request,
final HttpServletResponse response) throws ServletException,
IOException {
NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {

public void run() {
Shapshot.shapshot();
try {
response.sendRedirect("ok.jsp");
} catch (IOException e) {
e.printStackTrace();
}
}
});
NativeInterface.runEventPump();
return;
}

报同样的错

不过谢谢了啊,今天搞了一天,这个问题还没解决
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
对你的应用场景感觉到很奇怪,你这个网页快照的程序,是在Tomcat这端运行的,能截取哪里的网页呢?

另外就是,尝试不要重复创建 JWebBrowaser,而是使用用一个对象来做这个事情了。
xxyes 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 6 楼 的回复:
但这个最终用在servlet上时怎么调用。


Servlet?!

你在J2EE服务器上玩JFrame?这应该是不行的啊。。。


另外就是,也许你还得研究下:JWebBrowser这个组件,自身是否允许同时使用多个?
[/Quote]


其实就是网页快照,把结果通过servlet返回去,

在tomcat上,可以正常截取一次,第二次报错java.lang.IllegalStateException:

在main方法中一样。
头疼啊,JWebBrowser 这组件没说明没资料。。
xxyes 2012-08-30
  • 打赏
  • 举报
回复
找到一个有类似问题的人。。

http://topic.csdn.net/u/20110113/11/da8eca94-add0-490d-ab64-f76bd8ba46fa.html
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
但这个最终用在servlet上时怎么调用。
[/Quote]

Servlet?!

你在J2EE服务器上玩JFrame?这应该是不行的啊。。。


另外就是,也许你还得研究下:JWebBrowser这个组件,自身是否允许同时使用多个?
xxyes 2012-08-30
  • 打赏
  • 举报
回复
刚试了一下,这样不行

贴一下Jar3XML

public Jar3XML() {

super(new BorderLayout());
JPanel webBrowserPanel = new JPanel(new BorderLayout());
final String fileName = System.currentTimeMillis() + ""
+ new Random().nextInt();
final JWebBrowser webBrowser = new JWebBrowser(null);

webBrowser.setBarsVisible(false);
webBrowser.navigate(srcUrl);

webBrowserPanel.add(webBrowser, BorderLayout.CENTER);
add(webBrowserPanel, BorderLayout.CENTER);

JPanel panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 4, 4));

webBrowser.addWebBrowserListener(new WebBrowserAdapter() {

// 监听加载进度
public void loadingProgressChanged(WebBrowserEvent e) {
xxyes 2012-08-30
  • 打赏
  • 举报
回复
谢谢911,
但这个最终用在servlet上时怎么调用。

主要是外头那个壳儿,用第二次就错,不用也错
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Jar3XML().shapshot();
new Jar3XML().shapshot();
}
}
MiceRice 2012-08-30
  • 打赏
  • 举报
回复
汗。。。

创建 JFrame 不需要用 invokeLater 啊。。。

主要是这句话:“new JWebBrowser(null)” 时,用 invokeLater 来做。

比如:
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new Jar3XML().shapshot();
new Jar3XML().shapshot();
}
}
xxyes 2012-08-30
  • 打赏
  • 举报
回复
public static void main(String[] args) {

NativeInterface.open();
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// SWT组件转Swing组件,不初始化父窗体将无法启动webBrowser
JFrame frame = new JFrame("以DJ组件保存指定网页截图");
frame.getContentPane().add(
new Jar3("http://www.baidu.com/", 1500, 900),
BorderLayout.CENTER);
frame.setSize(600, 500);
// 仅初始化,但不显示
frame.invalidate();
frame.pack();
frame.setVisible(false);
}
});
NativeInterface.runEventPump();
System.out.println("ok");

}

new Jar3("http://www.baidu.com/", 1500, 900) 这里的参数是动态的

如何在其他地方调用 main方法中的代码

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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