意思是你不能用 主GUI线程以外的线程来调用该方法。建议你用:SwingUtilities.invokeLater 来借助主GUI线程,通过回调的方式间接调用该方法。

解决方案 »

  1.   

    SwingUtilities.invokeLater 不知道
    主GUI线程 不知道
    毁掉方式 不知道从何下手 迷茫
      

  2.   

    图形界面中,不是所有的线程都可以随意去操纵控件的,这个并发控制的难度很高,所以基本上所有的图形系统,都只有 1个主GUI线程 负责控制所有的控件和事件。Google下 invokeLater 的样例,学习下就大概知道意思了。
      

  3.   

    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方法中的代码
      

  4.   

    汗创建 JFrame 不需要用 invokeLater 啊主要是这句话:“new JWebBrowser(null)” 时,用 invokeLater 来做。比如:
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new Jar3XML().shapshot();
        new Jar3XML().shapshot();
      }
    }
      

  5.   

    谢谢911,
    但这个最终用在servlet上时怎么调用。主要是外头那个壳儿,用第二次就错,不用也错
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
      new Jar3XML().shapshot();
      new Jar3XML().shapshot();
      }
    }
      

  6.   

    刚试了一下,这样不行贴一下Jar3XMLpublic 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) {
      

  7.   


    Servlet?!你在J2EE服务器上玩JFrame?这应该是不行的啊
    另外就是,也许你还得研究下:JWebBrowser这个组件,自身是否允许同时使用多个?
      

  8.   

    找到一个有类似问题的人。。http://topic.csdn.net/u/20110113/11/da8eca94-add0-490d-ab64-f76bd8ba46fa.html
      

  9.   

    其实就是网页快照,把结果通过servlet返回去,在tomcat上,可以正常截取一次,第二次报错java.lang.IllegalStateException: 在main方法中一样。
    头疼啊,JWebBrowser 这组件没说明没资料。。
      

  10.   

    对你的应用场景感觉到很奇怪,你这个网页快照的程序,是在Tomcat这端运行的,能截取哪里的网页呢?另外就是,尝试不要重复创建 JWebBrowaser,而是使用用一个对象来做这个事情了。
      

  11.   


    就是放服务器上啊,就好像某些网站上的网页快照一样。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;
    }报同样的错不过谢谢了啊,今天搞了一天,这个问题还没解决
      

  12.   

    可能得换个思路来试试看。如果你不要中间件,直接用普通的J2SE的GUI程序,来调用这个JWebBrowaser,进行快照,能连续调用么?另外,这个JWebBrowaser关于快照,有没有时间差限制,也就是快照本身可能是异步的,如果连续调用会出错,但如果等到前一次快照完毕后,再调用下一次,是否就可以了?
    最后如果还没招,也许就的考虑换个做页面快照的组件了其实,搜索引擎的快照,并不保存图片,它只是稍微完整点下载了HTML和CSS的内容而已。
      

  13.   

    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)!
      

  14.   

    这个有点麻烦了,相当于是 NativeInterface 可能是不支持并发的。另外,NativeInterface.runEventPump(); 必须放在 finally 里面,确保执行。否则你一个return就跳过去了。
      

  15.   

    另外,这个JWebBrowaser关于快照,有没有时间差限制,也就是快照本身可能是异步的,如果连续调用会出错,但如果等到前一次快照完毕后,再调用下一次,是否就可以了?这个方法是最后的机会了。。
    经测试,JWebBrowaser确实是异步的,求大神给点方向……另外这方法写出来就是用来调用的啊!!总不至于总在main里写线程吧~~~真心搞不懂网上找遍了,遇到这问题的貌似都没解决,剩下的就是没遇到这问题的。。
      

  16.   

    把这几个操作快照的动作,独立封装为静态函数并强制同步试试看了:
    public static synchronized 返回值 takeSnapshot() {
       NativeInterface.open();
       try {
          return Shapshot.shapshot();
       } finally {
          NativeInterface.runEventPump();
       }
    }
      

  17.   

    解决了
    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");
      

  18.   

    楼主看看这个怎么解决:http://bbs.csdn.net/topics/390763662