2

I want to embed microsoft word in java . My program will open a word document file in jframe . After searching a lot , I have found the following solution : Open MS documents into JFrame

The code to embed MS documents into Jframe is as follows :

 import java.awt.Canvas;
import java.io.File;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.SWTError;
import org.eclipse.swt.SWTException;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;


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

        display.asyncExec(new Runnable() {
            public void run() {
                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); 
                    System.out.println(" I am in run method ");
                } catch (SWTError e) {
                    System.out.println("Unable to open activeX control");
                    display.dispose();
                    return;
                }  
                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();

                System.out.println(" I am in widgetSelected method ");
            }
        });
        MenuItem menuFileExit = new MenuItem(menuFile, SWT.CASCADE);
        menuFileExit.setText("Exit");
        menuFileExit.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                shell.dispose();
            }
        }); 
    }

    static class fileSaveItemListener implements SelectionListener {
        public void widgetSelected(SelectionEvent event) {
            fileOpen();

            System.out.println(" I am in widgetSelected method ");
        }

        public void widgetDefaultSelected(SelectionEvent event) {
            fileOpen();

            System.out.println(" I am in widgetSelected method ");
        }
      }

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

But I cannot open Shell window . There is also no menu in it . How can I open shall and show menu in it ? Please help me

Community
  • 1
  • 1
Christopher Marlowe
  • 2,098
  • 6
  • 38
  • 68
  • Why use a `import javax.swing.JFrame;` instead of a [`Shell`](http://help.eclipse.org/neon/index.jsp?topic=%2Forg.eclipse.platform.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fswt%2Fwidgets%2FShell.html) as the top level container? It is generally advised not to mix Sinwg & AWT components, but at least they share the EDT! – Andrew Thompson Nov 06 '16 at 12:18
  • It is the code taken from the link : http://stackoverflow.com/questions/4883937/open-ms-documents-into-jframe . How can I show shell and show menu in it ? – Christopher Marlowe Nov 07 '16 at 04:35
  • I don't deal with SWT. – Andrew Thompson Nov 07 '16 at 04:51
  • SWT shell is for showing Dialogue to choose file and JFrame is for showing word documents . Have you got it ? – Christopher Marlowe Nov 07 '16 at 05:00
  • 1
    @SagorAhmed You don't even need the `JFrame`. Just go plain SWT. There's nothing in your code that requires Swing. I can't try it here, cause I'm on a Linux machine. – Baz Nov 07 '16 at 18:07

1 Answers1

3

Following off of @Baz's suggestion, you can modify your code a bit to only use SWT.

For starters, you can remove the whole JFrame creation and setup:

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

    // Remove these lines:
    final 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);
    ...

Next, you don't need to create two Shell objects:

...
public static void main(final String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display); // Already creating a Shell here

    display.asyncExec(new Runnable() {
        public void run() {
            final Shell shell = SWT_AWT.new_Shell(display, canvas);  // Remove this
            shell.setSize(800, 600);
...

Next, you don't need the Runnable. Just set the size, text, and layout on the shell. From there you can add the OleFrame, etc. to the shell and open it.

You should be left with something like this for your main method:

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

    shell.setSize(800, 600);
    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.NONE, new File("Doc1.doc"));
        // esto abre un documento en blanco
        clientSite = new OleClientSite(frame, SWT.NONE, "Word.Document");
        addFileMenu(frame);
        System.out.println(" I am in run method ");
    } catch (final SWTError e) {
        System.out.println("Unable to open activeX control");
        display.dispose();
        return;
    }

    shell.open();

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

Minor note, but I also changed SWT.NULL to be SWT.NONE on the line mentioned below, because even though both have the value of 0x0, SWT.NONE is the more accurate style value (No style bits set).

clientSite = new OleClientSite(frame, SWT.NONE, "Word.Document");

With those changes, I was able to successfully open the application (by default it opened to a new, blank document) and use the toolbar to open a *.doc file:

enter image description here

avojak
  • 2,342
  • 2
  • 26
  • 32