SWT 2 Tabellen, aber nur 1 TableItem ausgewählt

Ischterai

Mitglied
Hi,

ich programmiere schon ein bisschen mit SWT rum, habe auch schon ne nette Gui gebastelt, mit DND, MouseListener und Keylistener, nur bin ich jetzt auf ein Problem gestoßen: Ich habe auf der Gui 2 Tabellen, bei welchen ich nur 1 TableItem insgesamt selectiert haben möchte, es sind aber immer 1 pro Tabelle, eins aktiv, eins passiv, aber von getSelectedIndex() erkannt. Gibt es da eine bestimmte SWT-Variable die ich beim erstellen der übergeordneten Componete einfügen muss oder muss ich mich darum manuel kümmern?

Hier mal die initialisierung, die listener lasse ich mal weg, sind etwas ausschweifend:
Code:
Composite composite= new Composite(folder, SWT.NONE);
shelllayout = new GridLayout();
		shelllayout.verticalSpacing = 2;
		shelllayout.marginHeight = 20;
		shelllayout.marginWidth = 20;
		shelllayout.numColumns = 3;
		shelllayout.makeColumnsEqualWidth = true;
		composite.setLayout(shelllayout);
...
GridData data = new GridData();
	   data.grabExcessHorizontalSpace = true;
	   data.grabExcessVerticalSpace = true;
	   data.verticalAlignment = GridData.FILL;
	   data.horizontalAlignment = GridData.FILL;
	   data.verticalSpan = 2;

Table table = new Table(composite, SWT.BORDER | SWT.FULL_SELECTION);
       table.setHeaderVisible(true);
       table.setLayoutData(data);
...
RowLayout tablelayout = new RowLayout();
	   tablelayout.wrap = false;
	   tablelayout.pack = true;
	   tablelayout.justify = false;
	   tablelayout.type = SWT.VERTICAL;

Table TableFieldCompo= new Table(group, SWT.BORDER | SWT.CENTER | SWT.FULL_SELECTION);
TableFieldCompo.setLayoutData(data);
      TableFieldCompo.setLayout(tablelayout);
      TableFieldCompo.getHorizontalBar().setVisible(false);

Da sind dann noch ein paar buttons drauf, für löschen und bearbeiten, bei welchen ich das problem habe nicht zu wissen in welcher tabelle das vorgesehene Objekt ist, da in beiden selectiert werden kann.


Sehe gerade Titel ist etwas unglücklich. Sorry.
 
Zuletzt bearbeitet:
Hallo,

wenn ich dich richtig verstanden habe, möchtest du, dass die Tabelle, die inaktiv ist, ihre Selektion verliert? Wenn das so ist, könntest du einfach einen FocusListener an jede Tabelle anhängen, und immer wenn die Tabelle den Fokus verliert (focusLost()-Methode), die deselectAll()-Methode der entsprechenden Tabelle aufrufen.

Grüße
Vincent
 
Danke erstemal,

du hast das leider nicht ganz richtig verstanden, ich möchte das immer nur 1 Item in den beiden tabellen selectiert ist.

Wenn das so ist, könntest du einfach einen FocusListener an jede Tabelle anhängen, und immer wenn die Tabelle den Fokus verliert (focusLost()-Methode), die deselectAll()-Methode der entsprechenden Tabelle aufrufen.

ja mit dem könnte man das machen, aber das Problem ist das er auch den fokus verliert wenn ich einen Button drücke, was schlecht für einen delete- oder edit-Button ist.
Funktioniert aufjeden fall, aber das Problem ist die Unterscheidung wann soll er das deselecten und wann nicht...

ich hatte es gerade mit einem MouseListener versucht, der beide tabelen deselcted und dann in der Tabelle wo das event her kommt das Item von Hand selectiert, ist aber langsam und unschön...
 
So habe es jetzt doch mit dem FocusListener gemacht:
Code:
table.addFocusListener(new FocusListener() {
		
		@Override
		public void focusLost(FocusEvent arg0) {
		}
		
		@Override
		public void focusGained(FocusEvent arg0) {
			if(selectedTable!=null){
				selectedTable.deselectAll();
			}
			selectedTable = (Table)arg0.getSource();
			
		}
	});

Wobei selectedTable eine Tabelle ist, in der immer die ist, welche zuletzt den fokus hatte. So verhält sich das Select so wie ich es haben wollte. Und da ich bei den Button die EventSource nehme habe ich auch keine Probleme mit den möglichen Fehlern, falls keine Tabelle den Fokus hat.

@moderator: Thread kann geschlossen werden.
 
Ok, man könnte es noch mit einem SelectionListener lösen. Einfach einen Lsitener an die beiden Tabellen anhängen, und wenn in einer Tabelle etwas selektiert wird, wird die Selektion in der anderen Tabelle gelöscht.

Hier ist ein (stark vereinfachtes) Beispiel um das zu veranschaulichen:

Java:
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class TwoTableSelectionTest
{

  public static void main( String[] args )
  {
    Display display = new Display();
    Shell shell = new Shell( display );
    shell.setSize( 400, 300 );
    shell.setLayout( new GridLayout( 2, true ) );

    final Table table1 = new Table( shell, SWT.BORDER | SWT.FULL_SELECTION );
    TableColumn column = new TableColumn( table1, SWT.NONE );
    column.setWidth( 180 );
    TableItem item = new TableItem( table1, SWT.NONE );
    item.setText( "One" );
    item = new TableItem( table1, SWT.NONE );
    item.setText( "Two" );
    table1.setLayoutData( new GridData( GridData.FILL, GridData.FILL, true, true ) );

    final Table table2 = new Table( shell, SWT.BORDER | SWT.FULL_SELECTION );
    column = new TableColumn( table2, SWT.NONE );
    column.setWidth( 180 );
    item = new TableItem( table2, SWT.NONE );
    item.setText( "Eins" );
    item = new TableItem( table2, SWT.NONE );
    item.setText( "Zwei" );
    table2.setLayoutData( new GridData( GridData.FILL, GridData.FILL, true, true ) );

    SelectionListener listener = new SelectionAdapter()
    {
      @Override
      public void widgetSelected( SelectionEvent e )
      {
        if ( e.widget == table1 )
        {
          table2.deselectAll();
        }
        else if ( e.widget == table2 )
        {
          table1.deselectAll();
        }
      }
    };
    table1.addSelectionListener( listener );
    table2.addSelectionListener( listener );

    shell.open();
    while ( !shell.isDisposed() )
    {
      if ( !display.readAndDispatch() )
      {
        display.sleep();
      }
    }
    display.dispose();
  }
}

Grüße
Vincent
 
Zurück