2016-11-03 35 views
-1

我想将java中的Jframe嵌入微软单词。这就是为什么我有以下代码:asyncExec方法不调用Runnable类的运行方法

public class AbrirWordJFrame { 
    static OleClientSite clientSite; 
    static OleFrame frame; 

    public static void main(String[] args) { 
     final Display display = new Display(); 
     final Shell shell = new Shell(display); 

     JFrame jframe=new JFrame("Mi jframe"); 
     final Canvas canvas=new Canvas(); 
     jframe.getContentPane().add(canvas); 
     jframe.setSize(800, 600); 
     jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     jframe.setVisible(true); 

     System.out.println("Before Async"); 

     display.asyncExec(new Runnable() { 
      public void run() { 
       System.out.println("In Async method"); 
       Shell shell = SWT_AWT.new_Shell(display, canvas); 
       shell.setSize(800, 600); 

       //abrimos un word 
       shell.setText("Word Example"); 
       shell.setLayout(new FillLayout()); 
       try { 
        frame = new OleFrame(shell, SWT.NONE); 
        //esto abre un documento existente 
        clientSite = new OleClientSite(frame, SWT.NULL, new File("prueba.doc")); 
        //esto abre un documento en blanco 
//     clientSite = new OleClientSite(frame, SWT.NONE, "Word.Document"); 
        addFileMenu(frame); 
       } catch (SWTError e) { 
        System.out.println("Unable to open activeX control"); 
        display.dispose(); 
        return; 
       } 
       //fin abrimos un word 
       //abrimos un navegador 
//    Browser browser = new Browser(shell, SWT.NONE); 
//    browser.setLayoutData(new GridData(GridData.FILL_BOTH)); 
//    browser.setSize(800, 600); 
//    browser.setUrl("http://www.google.com"); 
       //fin abrimos un navegador 
       shell.open(); 

      } 
     }); 

     // display d= new Display(new runnable); 


     //el titulo 
//  shell.setText("Word Example"); 
//  shell.setLayout(new FillLayout()); 
//  try { 
//   frame = new OleFrame(shell, SWT.NONE); 
//   //esto abre un documento existente 
//   clientSite = new OleClientSite(frame, SWT.NULL, new File("prueba.doc")); 
//   //esto abre un documento en blanco 
////   clientSite = new OleClientSite(frame, SWT.NONE, "Word.Document"); 
//   addFileMenu(frame); 
//  } catch (SWTError e) { 
//   System.out.println("Unable to open activeX control"); 
//   display.dispose(); 
//   return; 
//  } 
//  shell.setSize(800, 600); 
//  shell.open(); 
//  
     while (!shell.isDisposed()) { 
      /*if (!display.readAndDispatch()) 
       display.sleep();*/ 
     } 
     display.dispose(); 
    } 

    static void addFileMenu(OleFrame frame) { 
     final Shell shell = frame.getShell(); 
     Menu menuBar = shell.getMenuBar(); 
     if (menuBar == null) { 
      menuBar = new Menu(shell, SWT.BAR); 
      shell.setMenuBar(menuBar); 
     } 
     MenuItem fileMenu = new MenuItem(menuBar, SWT.CASCADE); 
     fileMenu.setText("&File"); 
     Menu menuFile = new Menu(fileMenu); 
     fileMenu.setMenu(menuFile); 
     frame.setFileMenus(new MenuItem[] { fileMenu }); 

     MenuItem menuFileOpen = new MenuItem(menuFile, SWT.CASCADE); 
     menuFileOpen.setText("Open..."); 
     menuFileOpen.addSelectionListener(new SelectionAdapter() { 
      public void widgetSelected(SelectionEvent e) { 
       fileOpen(); 
      } 
     }); 
     MenuItem menuFileExit = new MenuItem(menuFile, SWT.CASCADE); 
     menuFileExit.setText("Exit"); 
     menuFileExit.addSelectionListener(new SelectionAdapter() { 
      public void widgetSelected(SelectionEvent e) { 
       shell.dispose(); 
      } 
     }); 
    } 

    static void fileOpen() { 
     FileDialog dialog = new FileDialog(clientSite.getShell(), SWT.OPEN); 
     dialog.setFilterExtensions(new String[] { "*.doc" }); 
     String fileName = dialog.open(); 
     if (fileName != null) { 
      clientSite.dispose(); 
      clientSite = new OleClientSite(frame, SWT.NONE, "Word.Document", new File(fileName)); 
      clientSite.doVerb(OLE.OLEIVERB_INPLACEACTIVATE); 
     } 
    } 
} 

我收到以下情况除外:

Exception in thread "main" org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.IllegalArgumentException: Argument not valid) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Unknown Source) 
    at org.eclipse.swt.widgets.Display.runAsyncMessages(Unknown Source) 
    at org.eclipse.swt.widgets.Display.readAndDispatch(Unknown Source) 
    at AbrirWordJFrame.main(AbrirWordJFrame.java:95) 
Caused by: java.lang.IllegalArgumentException: Argument not valid 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.SWT.error(Unknown Source) 
    at org.eclipse.swt.ole.win32.OLE.error(Unknown Source) 
    at org.eclipse.swt.ole.win32.OLE.error(Unknown Source) 
    at org.eclipse.swt.ole.win32.OleClientSite.<init>(Unknown Source) 
    at AbrirWordJFrame$1.run(AbrirWordJFrame.java:55) 
    at org.eclipse.swt.widgets.RunnableLock.run(Unknown Source) 
    ... 4 more 

但asyncExec方法不调用运行的类的run方法。我在互联网上搜索了很多,但什么都没找到。请帮帮我 。

回答

2

你没有运行SWT事件调度循环,你必须运行这个为asyncExec(和SWT的许多其他部分)才能工作。

您有:

while (!shell.isDisposed()) { 
    /*if (!display.readAndDispatch()) 
     display.sleep();*/ 
} 

那些注释掉线是事件调度循环。你必须调用:

while (!shell.isDisposed()) { 
    if (!display.readAndDispatch()) 
    display.sleep(); 
} 

你混合Swing和SWT - 你不应该这样做,因为它是很难得到正常工作。使用Swing或SWT,但不能同时使用。您可以使用SWT_AWT类从SWT调用Swing代码,但这应该是最后一招。

+0

这个问题稍有修改。请参阅最新的问题。 –

+0

如果我删除评论,那么我有异常,这是在问题 –

+0

说明你的OleClientSite构造函数有什么问题,我不知道任何关于这个。 –