【发布时间】:2014-03-26 07:17:43
【问题描述】:
我正在使用我的 Java Web 应用程序 (JSF) 打开 Outlook 并附加一个文件。方法只工作一次,当我再次尝试调用方法时,我得到:
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 方法时,什么都没有发生。我可以在不必创建另一个方法的情况下对这个无效的线程访问进行排序吗?
【问题讨论】:
标签: java eclipse exception swt