2016-04-11 18 views
1

私は可能な解決策を探し求めていましたが、何も似ていませんでした。だから、可能かどうか尋ねる必要がある。SWTテーブルの選択ボックスを描画する方法は?

マウスをドラッグして複数のアイテムを選択するには、SWT Tableウィジェットで設定します。ネイティブOSと同じように。

設定したTableSWT.MULTIですが、これはキーボードのみで動作します。

SWTがネイティブOSコールを使用してGUIを描画するので、なぜこの機能がTableウィジェットですぐに実装されないのでしょうか?

これは、添付の画像で確認できるように、Angry IP Scannerユーティリティソフトウェアで既に実装されています。

私は何か助けに感謝します。

Selection box in a SWT Table

答えて

2

私は、あなたが同様の動作を実現するためにTrackerウィジェットを使用することができると思います。ここでは、何ができるかを示す簡単な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

これは私が必要とするものでした。ご支援ありがとうございました! –

+0

2番目のリスナーをテーブルに追加します。何かをするmouse.down。ただし、マウスイベントは1つしか送信できないようですが、 mouse.downまたはmouse.draggedのいずれかです。どうしたらいいですか? addListerer(SWT.MouseDown | SWT.DragDetect、e - > {...})を試しましたが、うまくいきませんでした。 –

0

誰かがそれを有用と判断した場合に備えて、この情報を共有したいと考えています。

SWT.SelectionリスナーをTableに追加するだけで、この機能は既に実装されています(これは私が思ったように「ファンシー」なコードを追加する必要はありません)。

table.addListener(SWT.Selection, new Listener() { 
    public void handleEvent(Event e) { 
     // to-do... 
    } 
} 
関連する問題