# Word Dokument im JPanel darstellen



## yerl (21. Feb 2011)

Hi Leute,

ich habe ein Problem, ich kriege es seit Tagen nicht hin ein Word Dokument in einem JFrame oder einem JPanel darzustellen. 

Habe es mit Apache POI versucht, kann auch den Inhalt der Word Datei einlesen und in einer TextArea darstellen, aber das ganze Dokument mit den ganzen Word Funktionen (Menüleisten etc.) kriege ich einfach nicht hin. In Visual Studio/C# ist es kein Prob., aber mit Java bin ich recht unerfahren.

Bitte, bitte hilft mir. Danke im Voraus.


----------



## hansmueller (21. Feb 2011)

Hallo,

da wirst du leider Pech haben. Mir ist bis jetzt keine Java-Bibliothek bekannt, die sowas kann. Beim Visual Studio/C# funktioniert es glaube ich nur, weil .Net da schon eine Menge vorgefertigert Funktionen hat. Ist ja praktisch ein Programm in ein Programm einbinden.

MfG
hansmueller


----------



## Guybrush Threepwood (21. Feb 2011)

Könnte das mit SWT gehen? Eclipse startet ja alle möglichen Programme zur Darstellung, wenn man diese doppelt anklickt.


----------



## yerl (21. Feb 2011)

Erstens: Danke für die Antworten.

Zweitens: @ Guybrush Threepwood (SWT)

Ich habe Google gefragt und folgendes gefunden, allerdings funktioniert mir das ganze zu unstabil (beim starten, wird nichts angezeigt erst nach dem man das Fester z.b. maximiert) und ich möchte das Word doc. rechts in einem Panel platzieren und links Funktionen meines Programms, habe es versucht mit einem Panel, es hat jedoch nicht funktioniert.

Würde mich über weitere Vorschläge (SWT oder auch anderes) sehr freuen.
Thx.


```
import java.awt.Canvas;
import java.awt.GridBagLayout;
import java.awt.Rectangle;
import java.io.File;
    
import javax.swing.JFrame;
import javax.swing.JPanel;

 import org.eclipse.swt.SWT;
 import org.eclipse.swt.SWTError;
 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.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.Display;
 import org.eclipse.swt.widgets.FileDialog;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
    
    
 public class WordJFrame 
 {
    		static OleClientSite clientSite;
    		static OleFrame frame;
    	
    		public static void main(String[] args) 
    		{
    		final Display display = new Display();
    		final Shell shell = new Shell(display);
    		/*
    		final JPanel jPanel = new JPanel();
    		jPanel.setLayout(new GridBagLayout());
    		jPanel.setBounds(new Rectangle(446, 7, 360, 478));
    		*/
    		JFrame jframe=new JFrame("GuiWordTest");
    		final Canvas canvas=new Canvas();
    		jframe.getContentPane().add(canvas);
    		//jframe.getContentPane().add(jPanel);
    		jframe.setSize(800, 600);
    		jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		jframe.setVisible(true);
    		jframe.setExtendedState(JFrame.MAXIMIZED_BOTH);
    		//jPanel.setVisible(true);
    		
    		display.asyncExec(new Runnable() 
    		{
    			public void run() 
    			{
    				Shell shell = SWT_AWT.new_Shell(display, canvas);
    				shell.setSize(800, 600);
    				

    				shell.setText("Word Example");
    				shell.setLayout(new FillLayout());
    				try 
    				{
    					frame = new OleFrame(shell, SWT.NONE);
    					clientSite = new OleClientSite(frame, SWT.NULL, new File("C:\\Documents and Settings\\test.doc"));
    					addFileMenu(frame);
    				} 
    				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();
    			}
    		});
    		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);
    		}
    	}
 }
```


----------



## Wildcard (21. Feb 2011)

SWT passt schon ganz gut, allerdings ist es sehr tricky SWT und AWT/Swing zu kombinieren. Daher kommt auch das Problem mit dem resize. Das ist nicht unlösbar, aber insbesondere das Fokus Handling wird sehr Tricky wenn du 2 grafische Toolkits parallel verwendest. Bessere Ergebnisse erhälst du wenn du dein Programm komplett auf SWT umstellst.
Alternativ dazu kannst du die Javabean von OpenOffice/LibreOffice verwenden um das .doc mit OpenOffice auf einem AWT Panel anzuzeigen.
Schau dir dazu am besten Nice Office Access (NOA) an.


----------



## yerl (23. Feb 2011)

Danke für die Antworten.

Swt ist die wohl die beste Alternative, ich habe mich jedoch entschlossen umzudisponieren.
Werde es mit ner .pdf versuchen.

Mit iText könnte ich nach bestimmten Begriffen in ner .pdf suchen und die passende Position mit dem PDFRenderer in ner Panel darstellen.

Mit IText konnte ich schon ein wenig Erfahrungen sammeln, jedoch nicht mit dem PdfRenderer.

Kann mir vielleicht jemand, ein paar Codezeilen Posten wie ich eine .pdf im Panel darstellen kann?

Danke im Voraus.


----------

