姬長信(Redy)

java – org.eclipse.swt.SWTException:无效的线程…


我正在使用My Java Web Application(JSF)打开outlook并附加文件. Methd只工作一次,当我再次尝试调用Method时,我得到:

org.eclipse.swt.SWTException: Invalid thread access

这是我的方法:

public void sendemails() {
        Display display = Display.getCurrent();
        Shell shell = new Shell(display);//Error is Happening on this Line.
        OleFrame frame = new OleFrame(shell, SWT.NONE);
        // This should start outlook if it is not running yet
        OleClientSite site = new OleClientSite(frame, SWT.NONE, "OVCtl.OVCtl");
        site.doVerb(OLE.OLEIVERB_INPLACEACTIVATE);
        // Now get the outlook application
        OleClientSite site2 = new OleClientSite(frame, SWT.NONE, "Outlook.Application");
        OleAutomation outlook = new OleAutomation(site2);
        OleAutomation mail = invoke(outlook, "CreateItem", 0 /* Mail item */).getAutomation();
        setProperty(mail, "BodyFormat", 2 /* HTML */);
        setProperty(mail, "Subject", "Testing");
        setProperty(mail, "HtmlBody", "I am Sending to you");
        ServletContext ctx = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext();
        String path = (String) ctx.getAttribute("capturepath");
        File file = new File(path);

        if (file.exists()) {
            OleAutomation attachments = getProperty(mail, "Attachments");
            invoke(attachments, "Add", path);
        } else {
            FacesContext.getCurrentInstance().addMessage(
                    null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                            "Failed!",
                            "File " + path + " Does Not exists"));
        }
        invoke(mail, "Display" /* or "Send" */);
    }

环顾四周后,我发现我应该创建一个这样的方法:

public void exec() {
        Display.getDefault().asyncExec(new Runnable() {
            @Override
            public void run() {
                sendemails();
                System.out.println("Outlook called");
            }
        });
    }

我有,但当我调用exec时没有任何事情发生.我可以排序这个无效的线程访问没有必要创建另一个方法?