2012-01-13 51 views
3

在Windows和Linux上,按住Ctrl鍵時,可以使用插入鍵上下移動而不更改選擇。該表顯示了一些視覺反饋。SWT表格:如何設置/獲取「聚焦」行

我玩過一個使用TableCursor的SWT代碼片段,但它看起來不完整,因爲它引入了一些新的錯誤 - 例如,當按下時Ctrl + 結束,它在跳回Ctrl鍵後跳回上一個選擇鍵。

如何獲得或設置此「聚焦」行?

回答

0

我不知道這正是你要尋找的,但如果你已經包裹你的TableTableViewer,您可以使用TableViewerEditor作爲單元編輯支持的一部分。 (我相信你可以使用TableViewerEditor的焦點功能,而不用實際編輯任何單元格。)

這實際上覆蓋了操作系統的焦點處理,但允許您以編程方式自定義焦點處理。我用它來啓用鍵盤遍歷單元格編輯。

這裏有一些快速和髒的示例代碼,可以支持聚焦一個單元格。 (未經測試的這是可能的,例如,小區的編輯支持必須被用於工作的TableViewerEditor支持啓用。)

FocusCellHighlighter cellHighlighter = new FocusCellHighlighter(tableViewer); 
TableViewerFocusCellManager focusManager = new TableViewerFocusCellManager(tableViewer, cellHighlighter); 

TableViewerEditor.create(tableViewer, focusCellManager, new ColumnViewerActivationStrategy(tableViewer), TableViewerEditor.KEYBOARD_NAVIGATION); 

然後,您可以通過獲得焦點的單元格:

ViewerCell focusedCell = viewer.getColumnViewerEditor().getFocusCell(); 
TableItem focusedItem = focusedCell != null ? focusedCell.getItem() : null; 

注這僅在Eclipse> = 3.3中啓用。

2

這看起來不像一個可以直接獲取/設置的屬性,但是您可以檢測來自繪畫事件和自定義繪製焦點的重點行。

添加Listener你的表SWT.PaintItem事件:

handleEvent(PaintEvent e) { 
    if (e.detail & SWT.FOSCUSED != 0) 
     myFocusedRow = ((Table)e.widget).indexOf((TableItem)e.item); 
    ... 
    if (e.item == myFocusedItem) 
     e.gc.drawFocus(e.x, e.y, e.width, e.height); 
} 
+0

我想,這種做法只會如果關注的行是可見的工作,不是嗎? – Mot 2012-01-16 18:12:18

+0

@MikeL。是的,但我認爲焦點不能在外部設置(Ctrl +某些),而不能看到項目(至少在Windows上)。 – 2012-01-16 19:00:19

0

要檢測一個表項是否被關注,你可以鍵入SWT.EraseItem或SWT.PaintItem的監聽器添加到表,讓它檢查位標誌SWT.FOCUSED在事件的詳細字段中設置。 (另請參閱this Eclipse forum post。)

我找不到任何API來設置關注的項目,但有一個醜陋的解決方法:發佈鼠標事件以模擬對項目的點擊。這要求選擇項目並在顯示屏上可見。下面的實用工具類包含做到這一點的方法:

import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Point; 
import org.eclipse.swt.graphics.Rectangle; 
import org.eclipse.swt.widgets.Control; 
import org.eclipse.swt.widgets.Event; 
import org.eclipse.swt.widgets.Table; 
import org.eclipse.swt.widgets.TableItem; 
import org.eclipse.swt.widgets.Widget; 

/** 
* Utility class for tables. 
* 
* @author Henno Vermeulen 
*/ 
public final class Tables { 

    private Tables() { 
    } 

    /** 
    * Shows and selects the table <code>item</code> and lets it get the 
    * keyboard focus. 
    * 
    * <p> 
    * Windows has a "focused" row (drawn with a dotted line) that can be moved 
    * independently of the selected row (when pressing ctrl + up/down). This 
    * method ensures that this focused row is made equal to the selected row so 
    * that the selection does not jump to an unwanted location when the user 
    * uses the up or down arrow on the keyboard. 
    * 
    * <p> 
    * Implementation detail: there is no API to get/set the focused row (see 
    * also <a href="https://www.eclipse.org/forums/index.php/t/241852/">this 
    * post</a> and <a href= 
    * "http://stackoverflow.com/questions/8852574/swt-table-how-to-set-get-focused-row"> 
    * this one</a>), so we use a filthy hack: faking a mouse click in the 
    * table. 
    */ 
    public static void selectAndFocus(TableItem item) { 
     fakeMouseClickTableItem(item); 
    } 

    private static void fakeMouseClickTableItem(TableItem item) { 
     Table table = item.getParent(); 
     table.showItem(item); 

     Point cursorLocation = item.getDisplay().getCursorLocation(); 
     fakeMouseClick(table, getCenter(item.getBounds(0))); 
     item.getDisplay().setCursorLocation(cursorLocation); 
    } 

    private static Point getCenter(Rectangle bounds) { 
     return new Point(bounds.x + bounds.width/2, 
       bounds.y + bounds.height/2); 
    } 

    /** 
    * Actually moves the mouse cursor to the given <code>location</code> so 
    * that the OS gives the correct click behavior. 
    */ 
    private static void fakeMouseClick(Control control, Point location) { 
     control.getDisplay().setCursorLocation(control.toDisplay(location)); 
     control.getDisplay() 
       .post(createMouseEvent(SWT.MouseDown, control, location)); 
     control.getDisplay() 
       .post(createMouseEvent(SWT.MouseUp, control, location)); 
    } 

    public static Event createMouseEvent(int type, Widget widget, 
      Point position) { 
     Event e = new Event(); 
     e.display = widget.getDisplay(); 
     e.widget = widget; 
     e.type = type; 
     e.x = position.x; 
     e.y = position.y; 
     e.count = 1; 
     e.button = 1; 
     e.doit = true; 
     return e; 
    } 
} 
相關問題