tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
4
ZUGRIFFE
983
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Ischterai Ischterai ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Ort
    Aachen
    Beiträge
    26
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    
    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.
    Geändert von Ischterai (30.03.10 um 12:38 Uhr) Grund: Fehler in titel
     

  2. #2
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    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
     
    "Any sufficiently advanced technology is indistinguishable from magic." Arthur C. Clarke.

  3. #3
    Ischterai Ischterai ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Ort
    Aachen
    Beiträge
    26
    Danke erstemal,

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

    Zitat Zitat von Vincentius Beitrag anzeigen
    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...
     

  4. #4
    Ischterai Ischterai ist offline Mitglied Bronze
    Registriert seit
    Mar 2009
    Ort
    Aachen
    Beiträge
    26
    So habe es jetzt doch mit dem FocusListener gemacht:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    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.
     

  5. #5
    Avatar von Vincentius
    Vincentius Vincentius ist offline Mitglied Brokat
    Registriert seit
    Sep 2004
    Ort
    Stuttgart
    Beiträge
    295
    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:

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    
    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
     
    "Any sufficiently advanced technology is indistinguishable from magic." Arthur C. Clarke.

Ähnliche Themen

  1. SWT TableItem über 2 Zeilen
    Von Ischterai im Forum Java
    Antworten: 2
    Letzter Beitrag: 14.06.10, 11:57
  2. SWT Tabelle Zeilenumbruch im TableItem
    Von haudek im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 22.02.09, 14:34
  3. SWT TableItem: Text zu lang
    Von Tobias Köhler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 1
    Letzter Beitrag: 19.12.07, 10:14
  4. SWT: TableEditor und TableItem
    Von Tobias Köhler im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 2
    Letzter Beitrag: 16.10.07, 13:27
  5. Zeilenumbruch in SWT TableItem?
    Von lina- im Forum Swing, Java2D/3D, SWT, JFace
    Antworten: 0
    Letzter Beitrag: 23.06.05, 11:10

Stichworte