# SWT Browser in Swing



## ich² (19. Mai 2008)

Hi,

ich würde gerne den Browser aus SWT in Swing einbauen. Dazu habe ich auch schon ein Codeschnippsel gefunden:


```
import java.awt.Canvas;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class BrowserSwingPanel {

	public static void main(String[] a) {
		JFrame frame = new JFrame("SWING browser"); 
		Canvas canvas = new Canvas();

		frame.setVisible(true);
		frame.setBounds(0, 0, 500, 500);
		canvas.setBounds(0, 0, 400, 400);
		frame.add(canvas);

		final Display display = new Display();
		final Shell shell = SWT_AWT.new_Shell(display, canvas);

		shell.setSize(400, 400);

		shell.setLayout(new FillLayout());
		shell.setBackground(new Color(display, 255, 0, 0));

		final Browser browser = new Browser(shell, SWT.NONE);

		browser.setUrl("www.google.com");

		shell.open();
		frame.validate();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose(); 
	}
}
```

Funktioniert auch ganz gut in Eclipse, aber ich weiß nicht, wie ich diese Mini-Anwendung deployen soll. Ich hab die swt.jar in den Classpath der JAR-Datei geschrieben, aber es hat nicht geholfen. Ich bekomme zwar keine Fehlermeldung, aber anstelle der Startseite von google bekomme ich nur ein rotes Fenster angezeigt ???:L .

Danke

ich²


----------



## Wildcard (19. Mai 2008)

Der SWT Browser ist doch nichts weiter als ein XULRunner, warum verwendest du den nicht direkt?


----------



## ich² (19. Mai 2008)

Hi wildcard,

ein XULRunner? ???:L ... noch nie davon gehört. Nach erstem Überfliegen des Wikipedia-Artikels kann man damit externe Anwendungen einbinden!? Wie funktioniert das?

Wichtig ist, dass ich mitbekomme, wenn sich die Titelleiste verändert.

Danke!

lg

ich²


----------



## ich² (19. Mai 2008)

Also so gehts:


```
import java.awt.Canvas;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class BrowserSwingPanel {

	public static void main(String args[]) {
		
		JFrame f = new JFrame();
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Canvas canvas = new Canvas();
		f.setSize(500, 400);
		f.add(canvas);
		f.setVisible(true);
		Display display = new Display();
		Shell shell = SWT_AWT.new_Shell(display, canvas);
		shell.setSize(500, 400);
		Browser browser = new Browser(shell, SWT.NONE);
		browser.setSize(500, 400);
		browser.setUrl("http://www.google.com");
		shell.open();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
		display.dispose();
	}
}
```

Nur bekomm ich beim Beenden der Applikation immer einen VMError:



> #
> # An unexpected error has been detected by Java Runtime Environment:
> #
> #  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x6d897336, pid=4728, tid=4764
> ...



Muss ich SWT irgendwie "besonders" beenden? Oder die SWT_AWT Bridge irgendwie closen?

Danke!

lg

ich²


----------



## The_S (19. Mai 2008)

Versuchs mal so


```
import java.awt.Canvas;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class BrowserSwingPanel {

   public static void main(String args[]) {
      
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
      Canvas canvas = new Canvas();
      f.setSize(500, 400);
      f.add(canvas);
      f.setVisible(true);
      Display display = new Display();
      Shell shell = SWT_AWT.new_Shell(display, canvas);
      shell.setSize(500, 400);
      Browser browser = new Browser(shell, SWT.NONE);
      browser.setSize(500, 400);
      browser.setUrl("http://www.google.com");
      shell.open();
      while (!shell.isDisposed() && f.isVisible()) {
         if (!display.readAndDispatch())
            display.sleep();
      }
      display.dispose();
      f.dispose();
   }
}
```


----------



## Guest (20. Mai 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> Versuchs mal so
> 
> 
> ```
> ...



Cool! Nach so einer Möglichkeit hab ich auch schon gesucht. 
Gibt es so etwas ähnliches auch für den VLC-Player? 
Ich hab schon mit dem jvlc probiert, es aber nicht wirklich hinbekommen.
VG,
ROlf


----------



## The_S (26. Mai 2008)

kA, evtl. kann man mit SWT auch den Standardplayer einbinden. So gut kenn ich mich mit SWT nicht aus, meine ganzen Projekte sind bis jetzt auch alle in Swing gehalten.


----------



## Flinn (13. Sep 2008)

das erzeugen eines SWT-Browsers mit diesem Code-Schnippsel funktioniert bei mir wunderbar, allerdings erhalte ich eine NullPointerException in der AWT-Event-Queue sobald ich mit dem Objekt interagieren will. 

Gibt es beim Einbinden von SWT in Swing etwas zu beachten, dass hier noch erwähnt ist?


----------



## Wildcard (13. Sep 2008)

Flinn hat gesagt.:
			
		

> Gibt es beim Einbinden von SWT in Swing etwas zu beachten, dass hier noch erwähnt ist?


Ja, du hast dann zwei UI Threads was einen enormen Synchronisationsaufwand mit sich bringt. Alles was von SWT an Swing geht muss mit invokeLater synchronisiert werden, alles was von Swing an SWT geht mit Display.asyncExec. 
Über allem hängt dann noch die konstante Gefahr zufälliger Deadlocks in den Tiefen beider Toolkits.


----------



## beastofchaos (3. Okt 2011)

Tschuldigt, dass ich so einfach hereinbreche, aber wo ist denn eine offizielle Seite, wo man das package org.eclipse runterladen kann?

Gruß, Thomas


----------



## Wildcard (4. Okt 2011)

Das package org.eclipse existiert nicht und was hat das mit diesem Thread zu tun?


----------



## Tomate_Salat (4. Okt 2011)

beastofchaos hat gesagt.:


> Tschuldigt, dass ich so einfach hereinbreche, aber wo ist denn eine offizielle Seite, wo man das package org.eclipse runterladen kann?
> 
> Gruß, Thomas



Wenn man schon die Schlagworte hat, nach denen man suchen muss :autsch:


----------



## b0312 (23. Nov 2011)

The_S hat gesagt.:


> Versuchs mal so
> 
> 
> ```
> ...



Hallo an alle!

Diesen Code habe ich auch probiert, da ich ein SWT Element in mein Swing UI einbauen will.
Leider, bekommt die "shell" bei der Methode "SWT_AWT.new_Shell(display, canvas)" den Wert "null" somit kommt dann auch eine "NullPointerException" bei der Methode "shell.setSize(500,400);

Ich finde hier nicht den Fehler, kann mir jemand weiterhelfen ?

Das ganze verwende ich in Netbeans IDE 7.0.1.
Die SWT API habe ich mir von der Eclipse Homepage heruntergeladen und in mein Projekt eingebunden.
Mein System: Windows XP

greeTz*
B0312


----------



## Sonecc (23. Nov 2011)

Die Methode SWT_AWT.new_Shell kann kein null zurückgeben.
Der Fehler liegt also nicht dort.

Es kann aber passieren, dass innerhalb der Methode Exceptions geworfen werden.

Poste mal bitte den Stacktrace deiner Exception


----------



## b0312 (29. Nov 2011)

wird nicht viel angezeigt


```
debug:
java.lang.NullPointerException
	at BrowserSwingPanel.main(BrowserSwingPanel.java:27)
```

ausser das eben shell "NULL" ist.


----------



## Sonecc (29. Nov 2011)

Zeig mal bitte deinen Quellcode (der zitierte kann es nicht sein)


----------



## b0312 (29. Nov 2011)

Das Problem war, das es im NetBeans nicht funktioniert hat. Hab denselben Quellcode mit denselben APIs auf Eclipse probiert und siehe da, es funktioniert.

Leider hapert es noch an der Umsetzung in meinem Programm, dort gibt es aber eine umfangreichere Fehlerbeschreibung.

System: Windows XP
Entwicklungsumgebung: Eclipse Indigo

QUELLCODE:

```
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * 
 *
 * 
 */
package gui.machines;

import java.awt.Canvas;

import javax.swing.JFrame;

import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 *
 * 
 */
public class machines extends javax.swing.JPanel {

    /** Creates new form machines */
    public machines() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {
    	
        canvas1 = new Canvas();
        setSize(500, 400);
        //setBackground(new java.awt.Color(255, 255, 255));
        add(canvas1);
        setVisible(true);
        Display display = new Display();
        Shell shell = SWT_AWT.new_Shell(display, canvas1);
        shell.setSize(300,400);
        Browser browser = new Browser(shell, SWT.NONE);
        browser.setSize(300, 400);
        browser.setUrl("http://www.google.com");
        shell.open();
        while (!shell.isDisposed() && isVisible()) {
        	if (!display.readAndDispatch())
        		display.sleep();
        }
      display.dispose();

    }// </editor-fold>//GEN-END:initComponents
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private java.awt.Canvas canvas1;
    // End of variables declaration//GEN-END:variables
}
```

FEHLERMELDUNG:

```
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Argument not valid [peer not created]
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.awt.SWT_AWT.new_Shell(Unknown Source)
	at gui.machines.machines.initComponents(machines.java:49)
	at gui.machines.machines.<init>(machines.java:31)
	at gui.main.gui.<init>(gui.java:149)
	at gui.main.gui$5.run(gui.java:136)
	at java.awt.event.InvocationEvent.dispatch(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$000(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Das UserInterface (eig. nur ein JPanel) habe ich im GUI-Bilder von NetBeans erstellt.


----------



## Sonecc (29. Nov 2011)

Die Problematik entsteht nativ.
Da bist du eventuell im Eclipse Forum besser aufgehoben. Ich persönlich kann dir dabei kaum weiterhelfen


----------



## Michael... (29. Nov 2011)

obiger Code funktioniert und dieser funktioniert nicht?
Vermutlich liegt das daran, dass die ganze SWT Geschichte im Kontext des Konstruktors der Klasse (Klassennamen schreibt man groß) passiert und das JPanel nicht sichtbar ist. 
Ich denke das Abbilden eines  SWT Objekts auf einem AWT Objekt ist nur möglich wenn letzeres auch aktuell sichtbar ist.
(Warum erbst die Klasse von JPanel wenn Du das ganze sowieso auf ein Canvas machst?)


----------



## b0312 (29. Nov 2011)

Es ist so das ich eine Klasse GUI habe
wo 4 TabbedPanels eingebaut sind.
In diesen 4 TabbedPanels werden verschiedene Panels angezeigt, die in eigenen Klassen geschrieben sind (die von JPanel erben).
Je nach dem auf welches Tab man klickt, wird ein JPanel angezeigt.

Was SWT angeht, ich habe es geschafft, das ganze in einem eigenen JFrame abzubilden. Jedoch will ich die SWT-Komponente im JPanel haben, dass dann im TabbedPanel angezeigt wird, wenn man auf den Tab klickt.


----------



## Michael... (29. Nov 2011)

Hab's gerade getestet und meine Vermutung wurde bestätigt: Die Komponente auf die die SWT Komponente abgebildet werden soll muss sichtbar sein bevor 
	
	
	
	





```
SWT_AWT.newShell(...)
```
 aufgerufen wird, da die SWT Komponente sofort ein existierendes Peer-Objekt benötigt über das sie sich auf der AWT Komponente zeichnen kann.


----------



## b0312 (29. Nov 2011)

Wenn ich aber mein Panel sichtbar mache, funktioniert es trotzdem nicht ?
Und das JFrame ist zu der Zeit wo das ausgeführt wird sowieso schon sichtbar


----------



## Michael... (29. Nov 2011)

Da muss ich mich verbessern. Ich meinte es muss angezeigt werden (darf auch neben dem Monitor angezeigt werden ;-))
und ich bezweifle, dass eine Komponente die gerade "konstruiert" wird irgendwo angezeigt wird.


----------



## b0312 (29. Nov 2011)

Hmm...vielen dank fürs Feedback!

Aber mir fällt keine Lösung ein :bahnhof:


----------



## Michael... (29. Nov 2011)

b0312 hat gesagt.:


> Aber mir fällt keine Lösung ein :bahnhof:


Du musst Deinen Frame inkl. Canvas fertigbauen und anzeigen lassen. Danach übergibst Du die Referenz auf das Canvas Objekt z.B. an eine Methode die das SWT darauf klatscht. Vom Prinzip her wie in dem funktionierenden Bsp. Code. Alles nach f.setVisible(true) könnte man in diese Methode stecken.
Wenn Du das ganze aber in einer AWT Komponente kapseln willst, wird evtl. schwierig. Da müsstest Du Dich vielleicht in Canvas oder Component reinhacken, um an der richtigen Stelle einzuhaken...


----------



## b0312 (30. Nov 2011)

Vielen Dank!

Ich mache es nun so, dass ich ein neues JFrame erzeuge und dort ist dann meine SWT Komponente (ich möchte das Nebula GANTT verwenden)

Das JFrame wird angezeigt, verändert kurz seine Farbe, aber das GANTT Diagramm das ich mir aus einem Code Snippet von Nebula GANTT geholt habe, wird nicht angezeigt.

Irgendwas läuft schief mit dem 
	
	
	
	





```
setVisible(true);
```
.. ich habe es mit 
	
	
	
	





```
addNotify();
```
probiert und am Ende erst das 
	
	
	
	





```
setVisible(true)
```
aber es funktioniert auch nicht.
irgendwie kommt mir auch vor das es Konflikte mit
	
	
	
	





```
dispose()
```
 und
	
	
	
	





```
display.dispose()
```
gibt.

Hier mein Code:

GUI.java:

```
...
private void jXPanel2ComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jXPanel2ComponentShown
// TODO add your handling code here:
    //setPanelMain(jXPanel2, machines);
	MachinesFrame mF = new MachinesFrame();
	mF.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    
}//GEN-LAST:event_jXPanel2ComponentShown
...
```

MachinesFrame.java:

```
package gui.machines;


/*******************************************************************************
 * Copyright (c) Emil Crumhorn - Hexapixel.com - [email]emil.crumhorn@gmail.com[/email]
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * [url=http://www.eclipse.org/legal/epl-v10.html]Eclipse Public License - Version 1.0[/url]
 *
 * Contributors:
 *    [email]emil.crumhorn@gmail.com[/email] - initial API and implementation
 *******************************************************************************/

import java.awt.Canvas;
import java.util.Calendar;
import java.util.List;

import javax.swing.JFrame;

import org.eclipse.nebula.widgets.ganttchart.AdvancedTooltip;
import org.eclipse.nebula.widgets.ganttchart.DateHelper;
import org.eclipse.nebula.widgets.ganttchart.GanttChart;
import org.eclipse.nebula.widgets.ganttchart.GanttEvent;
import org.eclipse.nebula.widgets.ganttchart.GanttGroup;
import org.eclipse.nebula.widgets.ganttchart.GanttSection;
import org.eclipse.nebula.widgets.ganttchart.themes.ColorThemeSilver;
import org.eclipse.swt.SWT;
import org.eclipse.swt.awt.SWT_AWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

/**
 * This Snippet shows a bit of everything that the chart can do.
 * 
 */
public class MachinesFrame extends javax.swing.JFrame{
	Display display;
	Shell shell;
	public MachinesFrame() {
		initComponents();
	}
	//public static void main(String args []) {
	private void initComponents(){

		//JFrame f = new JFrame();
		setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
        setTitle("GANTT");
		Canvas canvas = new Canvas();
		setSize(500, 400);
		add(canvas);
		setVisible(true);
		//addNotify();
		display = new Display();
		shell = SWT_AWT.new_Shell(display, canvas);
		shell.setSize(500, 400);
		shell.setLayout(new FillLayout());

		// Create a chart
		final GanttChart ganttChart = new GanttChart(shell, SWT.NONE, null,
				new ColorThemeSilver(), null, null);

		// Create some sections
		GanttSection sectionOne = new GanttSection(ganttChart, "Section 1");
		GanttSection sectionTwo = new GanttSection(ganttChart, "Section 2");
		GanttSection sectionThree = new GanttSection(ganttChart, "Section 3");

		// Create some calendars
		Calendar sdEventOne = Calendar.getInstance();
		Calendar edEventOne = Calendar.getInstance();
		edEventOne.add(Calendar.DATE, 10);

		Calendar sdEventTwo = Calendar.getInstance();
		Calendar edEventTwo = Calendar.getInstance();
		sdEventTwo.add(Calendar.DATE, 11);
		edEventTwo.add(Calendar.DATE, 15);

		Calendar cpDate = Calendar.getInstance();
		cpDate.add(Calendar.DATE, 16);

		// Create events
		GanttEvent eventOne = new GanttEvent(ganttChart, "Scope Event 1",
				sdEventOne, edEventOne, 35);
		eventOne.setFixedRowHeight(100);
		eventOne.setVerticalEventAlignment(SWT.CENTER);
		// lock this event down to a date span with both start and end dates
		Calendar sdEventOneLock = Calendar.getInstance();
		Calendar edEventOneLock = Calendar.getInstance();
		sdEventOneLock.add(Calendar.DATE, -5);
		edEventOneLock.add(Calendar.DATE, 15);
		eventOne.setNoMoveBeforeDate(sdEventOneLock);
		eventOne.setNoMoveAfterDate(edEventOneLock);

		// Create an advanced custom tooltip
		StringBuffer buf = new StringBuffer();
		buf.append("\\ceRevised: #rs# - #re# (#reviseddays# days)\n");
		buf.append("\\c100100100Planned: #sd# - #ed# (#days# days)\n");
		buf.append("\\c100000000Locked start: ");
		buf.append(DateHelper.getDate(sdEventOneLock, ganttChart.getSettings()
				.getDateFormat()));
		buf.append("\n");
		buf.append("\\c100000000Locked end: ");
		buf.append(DateHelper.getDate(edEventOneLock, ganttChart.getSettings()
				.getDateFormat()));
		buf.append("\n");
		buf.append("\\x#pc#% complete");

		AdvancedTooltip at = new AdvancedTooltip(eventOne.getName(),
				buf.toString());
		eventOne.setAdvancedTooltip(at);

		GanttEvent eventTwo = new GanttEvent(ganttChart, "Scope Event 2",
				sdEventTwo, edEventTwo, 10);

		// lock only the end date
		Calendar edEventTwoLock = Calendar.getInstance();
		edEventTwoLock.add(Calendar.DATE, 30);
		eventTwo.setNoMoveAfterDate(edEventTwoLock);

		GanttEvent eventThree = new GanttEvent(ganttChart, "Checkpoint",
				cpDate, cpDate, 75);
		eventThree.setCheckpoint(true);

		// opacities and layers
		eventOne.setLayer(1);
		eventTwo.setLayer(2);
		eventThree.setLayer(3);
		ganttChart.getGanttComposite().setLayerOpacity(1, 50);
		ganttChart.getGanttComposite().setLayerOpacity(2, 150);
		ganttChart.getGanttComposite().setLayerOpacity(3, 220);

		// Put the events in their respective sections
		sectionOne.addGanttEvent(eventOne);
		sectionOne.addGanttEvent(eventTwo);
		sectionOne.addGanttEvent(eventThree);

		// Create some groups
		GanttGroup groupOne = new GanttGroup(ganttChart);
		GanttGroup groupTwo = new GanttGroup(ganttChart);

		// Create 5 events for each group
		for (int x = 1; x <= 2; x++) {
			int start = 1;
			for (int i = 1; i < 6; i++) {
				Calendar tempStart = Calendar.getInstance();
				Calendar tempEnd = Calendar.getInstance();
				tempStart.add(Calendar.DATE, start);
				tempEnd.add(Calendar.DATE, start + 1);
				GanttEvent temp = new GanttEvent(ganttChart, x + ":" + i,
						tempStart, tempEnd, 50);

				if (x == 1)
					groupOne.addEvent(temp);
				else
					groupTwo.addEvent(temp);

				start += 9;
			}
		}

		sectionTwo.addGanttEvent(groupOne);

		// now let's squeeze a single event in between two groups
		Calendar sdEventFour = Calendar.getInstance();
		Calendar edEventFour = Calendar.getInstance();
		sdEventFour.add(Calendar.DATE, 4);
		edEventFour.add(Calendar.DATE, 13);
		GanttEvent eventFour = new GanttEvent(ganttChart, "Scope Event 4",
				sdEventFour, edEventFour, 40);
		eventFour.setFixedRowHeight(50);
		eventFour.setVerticalEventAlignment(SWT.CENTER);
		sectionTwo.addGanttEvent(eventFour);
		// Create connections
		ganttChart.addConnection(eventOne, eventTwo);
		ganttChart.addConnection(eventTwo, eventThree);
		// reverse one connection back up (not logical, but doable)
		ganttChart.addConnection(eventThree, eventOne);

		// and another group
		sectionTwo.addGanttEvent(groupTwo);

		// Let's connect all events in one group in one direction, and the other
		// in reverse
		// Note: It's not suggested to have connections between same-group
		// events.
		List groupOneEvents = groupOne.getEventMembers();
		for (int i = 0; i < groupOneEvents.size(); i++) {
			if (i >= 1) {
				GanttEvent ge1 = (GanttEvent) groupOneEvents.get(i - 1);
				GanttEvent ge2 = (GanttEvent) groupOneEvents.get(i);
				ganttChart.addConnection(ge1, ge2);
			}
		}

		// Now reverse.. do note that this makes really no sense for a lot of
		// reasons, but it's possible to do regardless
		List groupTwoEvents = groupTwo.getEventMembers();
		for (int i = groupTwoEvents.size() - 1; i >= 0; i--) {
			if (i > 0) {
				GanttEvent ge1 = (GanttEvent) groupTwoEvents.get(i);
				GanttEvent ge2 = (GanttEvent) groupTwoEvents.get(i - 1);
				ganttChart.addConnection(ge1, ge2);
			}
		}

		// move chart start date to the earliest event
		ganttChart.getGanttComposite().jumpToEarliestEvent();

		// Show chart
		shell.open();

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


----------



## Michael... (30. Nov 2011)

Hab keine Ahnung von SWT aber ich würde mal vermuten dass es jetzt nicht direkt mit SWT zusammenhängt, sondern mit der while Schleife am Ende der initComponents(), die ja in dem Fall eine Endlosschleife innerhalb des EDT ist. Somit wird die initComponents() bzw. der Konstruktor niemals verlassen und der EDT dauerhaft blockiert. Was in dem Demobeispiel einfach funktioniert, da ja quasi nur eine SWT Komponente angezeigt wird, funktioniert im Zusammenspiel mit Swing Komponenten nicht mehr ganz so einfach. Ein blockierender EDT kann natürlich keine Swing Komponenten mehr aktualisieren. Daher muss diese Schleife in einen separaten Thread ausgelagert werden.

Allgemein schaut es so aus als ist da aktuell viel zu viel Code. Weiss nicht ob die ganzen Calendar und Einstellung sein müssen, wenn eh nichts angezeigt wird.
Lieber mal klein und mit dem notwendigsten anfangen. Wenn das funktioniert das ganze Stück für Stück ausbauen. Bei Problemen wieder ein Stück zurück.

Hier mal ein Bsp zum auslagern der Schleife in einen separaten Thread:

```
class TestSWTFrame extends JFrame {
		public TestSWTFrame() {
			setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE);
			final Canvas canvas = new Canvas();
			setBounds(0, 0, 500, 400);
			add(canvas);
			setVisible(true);
			
			new Thread(new Runnable() {
				public void run() {
					Display display = new Display();
					Shell shell = SWT_AWT.new_Shell(display, canvas);
					shell.setSize(500, 400);
					Browser browser = new Browser(shell, SWT.NONE);
					browser.setSize(500, 400);
					browser.setUrl("http://www.google.com");
					shell.open();
					while (!shell.isDisposed() && isVisible()) {
						if (!display.readAndDispatch())
							display.sleep();
					}
					display.dispose();
					dispose();
				}
			}).start();
		}
	}
```


----------

