Sultan Ahmed
Sultan Ahmed

Reputation: 2220

Shall is not opening and Menu is not showing in swt in java

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

Upvotes: 2

Views: 845

Answers (1)

avojak
avojak

Reputation: 2360

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

Upvotes: 3

Related Questions