2016-11-03 3 views
-1

Ich möchte Microsoft Word in Jframe in Java einbetten. Deshalb habe ich den folgenden Code haben:asyncExec-Methode ruft nicht run-Methode der Runnable-Klasse

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); 
     } 
    } 
} 

Ich erhalte folgende Ausnahmen:

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 

Aber asyncExec Methode ist nicht run-Methode von runnable Klasse aufrufen. Ich habe viel im Internet gesucht und nichts gefunden. Bitte hilf mir .

Antwort

2

Sie führen die SWT-Ereignisverteilungsschleife nicht aus, Sie müssen diese für asyncExec (und viele andere Teile von SWT) ausführen, um zu funktionieren.

Sie haben:

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

Diese kommentierte out Linien sind die Ereignis-Dispatch-Schleife. Sie müssen rufen:

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

Aber Sie Schaukel und SWT mischen - Sie sollten dies nicht tun, da es sehr schwierig ist, zu erhalten richtig zu arbeiten. Verwende entweder Swing oder SWT, aber nicht beides. Sie können die Klasse SWT_AWT verwenden, um Swing-Code von SWT aufzurufen, aber dies sollte der letzte Ausweg sein.

+0

Die Frage ist leicht bearbeitet. Bitte sehen Sie sich die aktualisierte Frage an. –

+0

Wenn ich den Kommentar entferne, dann habe ich eine Ausnahme, die in der Frage –

+0

angegeben ist Etwas stimmt nicht mit Ihrem OleClientSite-Konstruktor, ich weiß nichts darüber. –

Verwandte Themen