Таблица SWT: как установить / получить «сфокусированную» строку - PullRequest
3 голосов
/ 13 января 2012

В Windows и Linux, удерживая нажатой клавишу Ctrl , можно перемещаться вверх и вниз с помощью клавиш курсора без изменения выбора.В таблице приведены некоторые визуальные отклики.

Я играл с фрагментом SWT, который использует TableCursor, но кажется недоделанным, потому что в нем появилось несколько новых ошибок - например, при нажатии Ctrl + Конец , он вернулся к предыдущему выбору после отпускания клавиши Ctrl .

Как получить или установить этот «сфокусированный» ряд?

Ответы [ 3 ]

2 голосов
/ 16 января 2012

Это не похоже на свойство, которое можно получить / установить напрямую, но вы можете обнаружить сфокусированную строку по событию рисования и настраивать фокусировку по своему усмотрению.1005 * к вашему столу на 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 голосов
/ 07 октября 2015

Чтобы определить, сфокусирован ли TableItem, вы можете добавить в таблицу Listener типа SWT.EraseItem или SWT.PaintItem и позволить ему проверить, установлен ли битовый флаг SWT.FOCUSED в поле сведений о событии.(См. Также это сообщение на форуме Eclipse .)

Я не смог найти какой-либо 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=
     * "/6385126/tablitsa-swt-kak-ustanovit-poluchit-sfokusirovannuy-stroku">
     * 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;
    }
}
0 голосов
/ 13 января 2012

Я не уверен, что это именно то, что вы ищете, но если вы обернули 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...