# SWT: nur eine Instanz einer View erlauben



## rapthor (3. Dez 2005)

Hallo,

ich habe mir meine eigene View geschrieben und möchte, dass sie nur 1 Mal in meiner Anwendung zu starten geht. Wenn sie also schon geöffnet ist, soll sie am besten gleich fokusiert werden.

Bisher habe ich in der ApplicationActionBarAdvisor-Klasse folgendes:


```
OpenViewAction dbOptionsAction = new OpenViewAction(window, "Einstellungen", View.ID);
        register(dbOptionsAction);
```

Der View heißt eben "View" und hat den Titel "Einstellungen"...

Wie mache ich das?


----------



## Lim_Dul (3. Dez 2005)

Stichwort: Singleton


----------



## rapthor (3. Dez 2005)

Hmm, naja das kenne ich ja. Aber bei SWT ist das so eine Sache. Das Framework ist ziemlich anders aufgebaut. Aber ich versuche mal ein Singleton einzubauen.

Wenn nicht, melde ich mich.


----------



## rapthor (4. Dez 2005)

Nee, das geht so einfach nicht. Ich habe ja keinen Konstruktor, der explizit aufgerufen wird. Und ich kann auch keine statische Methode getInstance() bauen, die ich dann irgendwo aufrufe. Denn diese Aufrufe geschehen ja automatisch.

Ich hab hier mal den Code zur View:


```
package Views;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.KeyEvent;
import org.eclipse.swt.events.KeyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.part.ViewPart;

import xMLBrowser.DBVerbindung;

public class View extends ViewPart {

	private Text dbPfadText;
	public static final String ID = "Views.view";
	
	public void createPartControl(Composite parent) {		
		Composite top = new Composite(parent, SWT.NONE);
		GridLayout layout = new GridLayout();
		layout.marginHeight = 0;
		layout.marginWidth = 0;
		top.setLayout(layout);
		// top banner
		Composite banner = new Composite(top, SWT.NONE);
		banner.setLayoutData(new GridData(GridData.HORIZONTAL_ALIGN_FILL, GridData.VERTICAL_ALIGN_BEGINNING, true, false));
		layout = new GridLayout();
		layout.marginHeight = 5;
		layout.marginWidth = 10;
		layout.numColumns = 2;
		banner.setLayout(layout);
		
		Listener verbListener = new Listener ()
		{
			public void handleEvent(Event event) {
				verbindeZuDB();
			}
		};
		
		KeyListener verbKeyListener = new KeyListener ()
		{
			public void keyPressed(KeyEvent e) {
				if (e.keyCode == SWT.CR && dbPfadText.getText().length()>0)
					verbindeZuDB();
			}

			public void keyReleased(KeyEvent e) {
			}
		};
		
		GridData gdDBFenster = new GridData(SWT.FILL, SWT.FILL, true, true);
		gdDBFenster.horizontalSpan = 3;
		
		Label l = new Label(banner, SWT.SIMPLE);
		l.setText("eXist Datenbank:");
		
		dbPfadText = new Text(banner, SWT.SINGLE | SWT.BORDER);
		dbPfadText.setText("xmldb:exist://localhost:8080/exist/xmlrpc/db/");
		//dbPfadText.setText("xmldb:exist://win87.tfh-berlin.de/exist/xmlrpc/db/");
		dbPfadText.setLayoutData(gdDBFenster);
		dbPfadText.addKeyListener(verbKeyListener);
		
		Button b = new Button(banner, SWT.FLAT);
		b.setText("Verbinden");
		b.addListener(SWT.Selection, verbListener);
	}
	
	private void verbindeZuDB()
	{
		getViewSite().getActionBars().getStatusLineManager().setMessage("Verbindung wird hergestellt ...");
		DBVerbindung.getInstance().verbinde(dbPfadText.getText());
		dbPfadText.setText("");
	}

	public void setFocus() {
	}
}
```


----------



## rapthor (4. Dez 2005)

Also in der plugin.xml gibt es für jeden View Einstellungen. Unter anderem auch "allowMultiple=true". Wenn das auf FALSE steht, kann man zwar nur noch einen View öffnen, aber wenn man den mal schließt, bekommt man nie wieder einen View angezeigt, weil der anscheinend noch im Hintergrund "schläft" aber nicht sichtbar ist.


```
<view
            name="DB Pfad"
            allowMultiple="true"
            icon="icons/sample2.gif"
            class="Views.View"
            id="Views.view">
      </view>
```

Das muss auch irgendwie anders gehen ....


----------



## ronny (4. Dez 2005)

verstehe irgendwie das problem nicht...   ???:L 
das mit dem allowMultiple funktioniert doch super.

du kannst jederzeit die view wieder über "Window" -> "Show View" 
herholen...


----------

