在Windows和Linux上,按住Ctrl鍵時,可以使用插入鍵上下移動而不更改選擇。該表顯示了一些視覺反饋。SWT表格:如何設置/獲取「聚焦」行
我玩過一個使用TableCursor
的SWT代碼片段,但它看起來不完整,因爲它引入了一些新的錯誤 - 例如,當按下時Ctrl + 結束,它在跳回Ctrl鍵後跳回上一個選擇鍵。
如何獲得或設置此「聚焦」行?
在Windows和Linux上,按住Ctrl鍵時,可以使用插入鍵上下移動而不更改選擇。該表顯示了一些視覺反饋。SWT表格:如何設置/獲取「聚焦」行
我玩過一個使用TableCursor
的SWT代碼片段,但它看起來不完整,因爲它引入了一些新的錯誤 - 例如,當按下時Ctrl + 結束,它在跳回Ctrl鍵後跳回上一個選擇鍵。
如何獲得或設置此「聚焦」行?
我不知道這正是你要尋找的,但如果你已經包裹你的Table
在TableViewer
,您可以使用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中啓用。
這看起來不像一個可以直接獲取/設置的屬性,但是您可以檢測來自繪畫事件和自定義繪製焦點的重點行。
添加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);
}
要檢測一個表項是否被關注,你可以鍵入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;
}
}
我想,這種做法只會如果關注的行是可見的工作,不是嗎? – Mot 2012-01-16 18:12:18
@MikeL。是的,但我認爲焦點不能在外部設置(Ctrl +某些),而不能看到項目(至少在Windows上)。 – 2012-01-16 19:00:19