2009-06-04 7 views
1

Ich verwende die TableViewer, um Informationen in einer Tabelle anzuzeigen. Der Benutzer kann eine der angezeigten Optionen auswählen, indem er eine Zeile der Tabelle auswählt.Show TableViewer nicht in Zeile, aber in Matrixreihenfolge

Ich möchte eine Tabelle in Matrixform erstellen, in der der Benutzer nicht nur die Zeile auswählen kann. Es sollte möglich sein, jeden Punkt der Tabelle, wie Zeile 2, Spalte 3, auszuwählen. Für jede Elementauswahl wird eine Aktion aufgerufen, um diesen Gegenstand wie im TableViewer zu behandeln.

Soweit ich jetzt kann ich CellModifier und CellEditors zu der Zeile der Spalten der Tabelle hinzufügen, aber die Referenz für die Aktion ist immer das Linienobjekt und nicht das ausgewählte TableItem.

Hat jemand ein Beispiel, wie man eine solche Matrix in einem Composite erstellen kann? Ich kann es erstellen, indem Sie ein GridLayout festlegen und die Komponenten in einer For-Schleife hinzufügen, aber ich bekomme Probleme, wenn ich das Composite mit neuen Kindern neu zeichnen möchte. Der TableViewer hat diese Handhabung bereits, daher möchte ich ihn nicht noch einmal implementieren.

Antwort

2

Ich hatte das gleiche Problem vor einer Weile und die einzige Möglichkeit, die ich gefunden habe, zu lösen, war ein Mouse-Listener auf dem SWT-Tabellen-Widget für den Tabellen-Viewer zu registrieren.

MouseListener columnSelectionMouseListener = new ColumnSelectionMouseListener(); 
getViewer().getTable().addMouseListener(columnSelectionMouseListener); 

public class ColumnSelectionMouseListener implements MouseListener { 

    private TableColumn selectedColumn; 

    @Override 
    public void mouseDoubleClick(MouseEvent e) { 
     // Nothing to do here 
    } 

    @Override 
    public void mouseDown(MouseEvent e) { 
     table = (Table) e.widget; 
    TableItem item = table.getItem(new Point(e.x, e.y)); 
    for (int i = 0; i < table.getColumnCount(); i++) { 
     TableColumn column = table.getColumn(i); 
     Rectangle bounds = item.getBounds(i); 
     if (bounds.contains(e.x, e.y)) { 
      selectedColumn = column; 
     } 
    } 
    } 

    @Override 
    public void mouseUp(MouseEvent e) { 
     // Nothing to do here 
    } 

    public TableColumn getSelectedField() { 
      return selectedColumn; 
    } 
} 

Dann wird zum Beispiel bei der Auswahl Hörer des Betrachters, können Sie die Maus Zuhörer fragen Spalte, die ausgewählt wurde, wenn die Maus gedrückt wurde und kombinieren, die mit der ausgewählten Zeile aus der Auswahl des Betrachters kommt die entsprechende auszuführen Aktion.

Hoffe, das kann helfen.

Manu

Verwandte Themen