2016-04-11 6 views
1

Ich habe nach einer möglichen Lösung gegoogelt, aber nichts ähnliches kam auf. Also muss ich fragen, ob es möglich ist.Wie zeichne Auswahlbox auf SWT Tabelle?

Ich möchte in einem SWT Table Widget mehrere Elemente mit meiner Maus auswählen, wenn Sie gezogen werden. Genau wie im nativen Betriebssystem.

Ich habe meine Table mit SWT.MULTI eingerichtet, aber das funktioniert nur für die Tastatur.

Ich bin neugierig, da SWT Native-OS-Aufrufe verwendet, um seine GUI zu zeichnen, warum diese Funktion nicht im Table Widget out-of-the-box implementiert ist?

Dies ist bereits in Angry IP Scanner Dienstprogramm-Software implementiert, wie Sie auf dem beigefügten Bild sehen können.

Ich würde jede Art von Hilfe zu schätzen wissen.

Selection box in a SWT Table

Antwort

2

Ich glaube, Sie Tracker Widget ähnliches Verhalten zu erreichen, verwenden können. Hier ist ein einfaches POC, um zu zeigen, was getan werden kann.

public class TableShellExample { 

    Display d; 

    Shell s; 

    TableShellExample() { 

    d = new Display(); 
    s = new Shell(d); 

    s.setSize(250, 200); 

    s.setText("A Table Shell Example"); 
    s.setLayout(new FillLayout()); 

    Table table = new Table(s, SWT.MULTI | SWT.FULL_SELECTION); 

    TableColumn tc1 = new TableColumn(table, SWT.CENTER); 
    TableColumn tc2 = new TableColumn(table, SWT.CENTER); 
    TableColumn tc3 = new TableColumn(table, SWT.CENTER); 
    tc1.setText("First Name"); 
    tc2.setText("Last Name"); 
    tc3.setText("Address"); 
    tc1.setWidth(70); 
    tc2.setWidth(70); 
    tc3.setWidth(80); 
    table.setHeaderVisible(true); 

    TableItem item1 = new TableItem(table, SWT.NONE); 
    item1.setText(new String[] { "Tim", "Hatton", "Kentucky" }); 
    TableItem item2 = new TableItem(table, SWT.NONE); 
    item2.setText(new String[] { "Caitlyn", "Warner", "Ohio" }); 
    TableItem item3 = new TableItem(table, SWT.NONE); 
    item3.setText(new String[] { "Reese", "Miller", "Ohio" }); 
    TableItem item4 = new TableItem(table, SWT.NONE); 
    item4.setText(new String[] { "Rey", "Miller", "Texas" }); 
    TableItem item5 = new TableItem(table, SWT.NONE); 
    item5.setText(new String[] { "Json", "Miller", "Alabama" }); 

    if((table.getStyle() & SWT.MULTI) != 0 && (table.getStyle() & SWT.FULL_SELECTION) != 0) 
    table.addListener(SWT.DragDetect, e -> { 

     TableItem item = table.getItem(new Point(e.x, e.y)); 
     int startIndex = -1; 
     int endIndex = -1; 
     if (item != null) { 
     startIndex = table.indexOf(item); 
     Tracker tracker = new Tracker(table.getParent(), SWT.RESIZE); 
     tracker.setStippled(true); 
     tracker.setRectangles(new Rectangle[] { new Rectangle(e.x,e.y,1,1) }); 
     if (tracker.open()) { 
      TableItem finishedItem = table.getItem(table.toControl(Display.getDefault().getCursorLocation())); 
      if (finishedItem != null) { 
      endIndex = table.indexOf(finishedItem); 
      } 
     } 
     tracker.dispose(); 
     table.deselectAll(); 
     if (startIndex != -1 && endIndex != -1) { 
      table.setSelection(Math.min(startIndex, endIndex), Math.max(startIndex, endIndex)); 
     } 
     } 

    }); 

    s.open(); 
    while (!s.isDisposed()) { 
     if (!d.readAndDispatch()) 
     d.sleep(); 
    } 
    d.dispose(); 
    } 

    public static void main(String[] argv) { 

    new TableShellExample(); 
    } 
} 
+0

Das war GENAU, was ich brauche! Vielen Dank für deine Unterstützung! –

+0

Ich möchte der Tabelle einen zweiten Listener hinzufügen. Wenn mouse.down, etwas zu tun. Es scheint jedoch, dass nur ein Mausereignis ausgelöst werden kann. entweder mouse.down oder mouse.dragged. Wie kann ich es tun? Ich habe versucht, addListerer (SWT.MouseDown | SWT.DragDetect, e -> {...} aber hat nicht funktioniert. –

0

Ich möchte dies teilen, nur für den Fall, dass jemand anderes es nützlich findet.

Diese Funktion ist bereits implementiert (ohne zusätzlichen "fancy" Code hinzuzufügen, wie ich dachte), indem Sie einfach einen SWT.Selection Listener zu Ihrem Table hinzufügen und das ist alles!

table.addListener(SWT.Selection, new Listener() { 
    public void handleEvent(Event e) { 
     // to-do... 
    } 
}