Selection nur jedes zweite Mal aktiv?

SegFault

Bekanntes Mitglied
Ich habe eine View in der, in einer Tabelle, Daten angezeigt werden. Beim Doppelklick auf einen Datensatz wird ein Editor mit diesen DAtensatz geöffnet. Klicke ich erneut Doppelt auf einen Datensatz kommt eine meldung das der Command nicht gefunden werden kann (Es wird nicht erkannt das eine Selection aktiv ist), Klicke ich wieder doppelt klappt es wieder. Das ganze kann ich beliebig oft wiederholen. Immer nur jeden zweiten (doppel)klick wird die selection erkannt. Es könnte mit den öffnen des Editors zusammenhängen aber ich weiss nicht wie ich das ganze lösen soll.

PS.: Ich hab rausgefunden dass es daran liegt das der Editor aktiv ist, jedoch ist immer noch das Table von der View mit seiner Selection aktiviert. Wie kann ich also beim öffnen des Editors die Selection in der View vergessen lassen? Bzw grundsätzlich wenn der Editor aktiv wird, die Selection deaktivieren (GEnauso wie es der fall ist wenn ein anderes Steuerelement aktiv ist).
 
Zuletzt bearbeitet:

SegFault

Bekanntes Mitglied
Ich mach das nicht viel anders als es in den tutorials beschrieben wird.
Hier der Code für den Command
Java:
@Override
	public Object execute(ExecutionEvent event) throws ExecutionException {
		IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindow(event);
		IWorkbenchPage page = window.getActivePage();
		UserView view = (UserView) page.findView(UserView.ID);
		ISelection selection = view.getSite().getSelectionProvider().getSelection();
		if (selection != null && selection instanceof IStructuredSelection) 
		{
			Object obj = ((IStructuredSelection) selection).getFirstElement();
			// If we had a selection lets open the editor
			if (obj != null) 
			{
				TONutzer nutzer = (TONutzer) obj;
				UserEditorInput input = new UserEditorInput(nutzer);
				try 
				{
					page.openEditor(input, UserEditor.ID);
				} 
				catch (PartInitException e) 
				{
					e.printStackTrace();
				}
			}
		}
		return null;
	}

Und hier der Doppelklickhandler auf einen Eintrag in der Tabelle der den Command ausführt

Java:
// New
	private void hookDoubleClickCommand() 
	{
		viewer.addDoubleClickListener(new IDoubleClickListener() 
		{
			public void doubleClick(DoubleClickEvent event) 
			{
				IHandlerService handlerService = (IHandlerService)getSite().getService(IHandlerService.class);
				try 
				{
					handlerService.executeCommand("de.weiss.werkstatt-client.EditNutzer", null);
				} 
				catch (Exception ex) 
				{
					ex.printStackTrace();
					throw new RuntimeException("de.weiss.werkstatt-client.EditNutzer not found");
				}
			}
		});
	}

und natürlich melde ich viewer als Selectionprovider an wenn die View erstellt wird.
 
G

Gast2

Gast
klappt bei mir aber wunderbar

EDIT: versuch doch mal du debuggen wie weit du kommst.
 
Zuletzt bearbeitet von einem Moderator:

SegFault

Bekanntes Mitglied
Der Usereditor ist beim mir ein EditorPart bestehend aus einzelnen Dialogelementen. Beim öffnen des Editors ist der Editor zwar aktiv aber der Fokus ist noch beim View, was wohl den fehler auslöst. Ich müsste wohl den Fokus direkt in den neuen Editor setzen.
Hier noch der code zum aufbau des Editors, ggf fehlt dort noch etwas.:
Java:
@Override
	public void createPartControl(Composite parent) {
		this.shell = parent.getShell();
		int BASEWIDTH = 70;
		
		GridLayout layout = new GridLayout();
		GridData gridData = null;
		layout.numColumns = 4;
		parent.setLayout(layout);
		Label label = null;
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		//Nutzername Label
		label.setText("Nutzername:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//Nutzername Textfeld
		nutzername = new Text(parent, SWT.BORDER);
		nutzername.setText(nutzer.getNutzername());
		nutzername.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		nutzername.setLayoutData(gridData);
		//Namen Zeile
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		label.setText("Vorname:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//Namen textfeld
		vorname = new Text(parent, SWT.BORDER);
		vorname.setText(nutzer.getVorname());
		vorname.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		vorname.setLayoutData(gridData);
		//nachname textfeld
		label = new Label(parent, SWT.NONE | SWT.RIGHT);
		label.setText("Nachname:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		gridData.grabExcessHorizontalSpace = false;
		gridData.horizontalAlignment = GridData.FILL;
		label.setLayoutData(gridData);
		//nachname textfeld
		nachname = new Text(parent, SWT.BORDER);
		nachname.setText(nutzer.getNachname());
		nachname.addModifyListener(ml);
		gridData = new GridData();
		gridData.horizontalSpan=3;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		nachname.setLayoutData(gridData);
		//Passwortfeld
		Group border = new Group(parent, SWT.SHADOW_ETCHED_IN);
		border.setText("Passwort");
		//Layout setzen
		layout = new GridLayout();
		layout.numColumns = 2;
		border.setLayout(layout);
		label = new Label(border, SWT.NONE | SWT.RIGHT);
		label.setText("Passwort:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		label.setLayoutData(gridData);
		password[0] = new Text(border, SWT.BORDER);
		password[0].setEchoChar('*');
		gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		password[0].setLayoutData(gridData);
		password[0].addModifyListener(ml);
		label = new Label(border, SWT.NONE | SWT.RIGHT);
		label.setText("wiederholen:");
		gridData = new GridData();
		gridData.widthHint = BASEWIDTH;
		label.setLayoutData(gridData);
		password[1] = new Text(border, SWT.BORDER);
		password[1].setEchoChar('*');
		password[1].addModifyListener(ml);
		gridData = new GridData();
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		password[1].setLayoutData(gridData);
		//ins parent setzen
		gridData = new GridData();
		gridData.horizontalSpan=4;
		gridData.verticalSpan=3;
		gridData.heightHint=BASEWIDTH;
		gridData.grabExcessHorizontalSpace = true;
		gridData.horizontalAlignment = GridData.FILL;
		gridData.verticalAlignment = GridData.FILL;
		border.setLayoutData(gridData);
		


	}
 
G

Gast2

Gast
da gibts doch eine methode die du überschreiben musst setFocus oder sowas...
setz da doch mal dein 1. Control auf setFocus damit immer ein textfeld den focus bekommt...
z.B. nutzername.setFocus();
 

Ähnliche Java Themen


Oben