2016-04-11 74 views
1

Olası bir çözüm için etrafta dolaşıyorum ama benzer bir şey çıkmadı. Yani, mümkün olup olmadığını sormam gerek.SWT Tablosunda seçim kutusu nasıl çizilir?

Bir SWT Table widget'ında sürüklendiğimde fareyle birden çok öğe seçmek istiyorum. Tıpkı yerel işletim sistemindeki gibi.

Table'u SWT.MULTI ile kurdum, ancak bu yalnızca klavye için çalışıyor.

SWT, kendi GUI'sini çizmek için yerel OS çağrılarını kullandığı için, bu işlevin neden Table widget'ında kullanıma hazır olmadığını merak ediyorum.

Bu, ekli resimde de görüldüğü gibi Angry IP Scanner yardımcı program yazılımında zaten uygulanmıştır.

Her türlü yardım için minnettarım.

Selection box in a SWT Table

cevap

2

Sana benzer bir davranış elde etmek Tracker Widget kullanabilirsiniz düşünüyorum. İşte ne yapılabileceğini göstermek için basit bir POC.

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

Bu tam ihtiyacım olan şeydi! Desteğiniz için çok teşekkür ederiz! –

+0

Tabloya ikinci bir dinleyici eklemek istiyorum. Mouse.down bir şey yapmak için. Bununla birlikte, sadece bir fare olayı gönderilebilir gibi görünüyor; mouse.down veya mouse.dragged. Nasıl yapabilirim? AddListerer'ı (SWT.MouseDown | SWT.DragDetect, e -> {...} kullanmayı denedim, ancak çalışmadı. –

0

Bunu başka birinin yararlı bulduğu durumlarda paylaşmak istiyorum.

Bu işlev zaten uygulanmışsa (düşündüğüm gibi fazladan bir "fantezi" kodu eklemek zorunda kalmadan), Table ürününüze bir SWT.Selection Dinleyici ekleyerek ve hepsi bu kadar!

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