如何使用SWT TableViewer中的enter键向下导航 [英] How to navigate down with enter key in SWT TableViewer

查看:183
本文介绍了如何使用SWT TableViewer中的enter键向下导航的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 TableViewer ,并希望当我按下回车键时选择按下一个单元格,就像在MS Excel中一样。我使用以下 findSelectedCell 实现了我自己的 CellNavigationStrategy

I have a TableViewer and want the selection to go down one cell when I press the enter key, much like in MS Excel. I implemented my own CellNavigationStrategy with the following findSelectedCell.

public ViewerCell findSelectedCell(ColumnViewer viewer,
                            ViewerCell currentSelectedCell, Event event) {
                        if (event.type == ColumnViewerEditorActivationEvent.KEY_PRESSED) {
                            if (event.keyCode == SWT.CR
                                    || event.keyCode == SWT.KEYPAD_CR) {
                                ViewerCell nextCell = currentSelectedCell
                                        .getNeighbor(ViewerCell.BELOW, false);
                                return nextCell;
                            }
                        }
                        return null;
                    }

只要我有 ViewerCell,这个效果很好.LEFT ViewerCell.RIGHT
当我尝试 ViewerCell.ABOVE ViewerCell.BELOW nextCell 实际设置为上方或下方的
单元格,但在GUI中,选择保持在 currentSelectedCell

This works pretty well as long as I have ViewerCell.LEFT or ViewerCell.RIGHT. When I try ViewerCell.ABOVE or ViewerCell.BELOW nextCell is actually set to the cell above or below, but in the GUI the selection stays at currentSelectedCell.

findSelectedCell的API文档说:

The API-Documentation for findSelectedCell says:


返回:

下一个突出显示的单元格,如果采用默认的
实现,则为null。例如。对
PAGE_DOWN请求做出反应是不可能的。

the cell which is highlighted next or null if the default implementation is taken. E.g. it's fairly impossible to react on PAGE_DOWN requests

我不明白这句话是什么意思。任何人都可以向我说明为什么不能将选择设置为低于或高于的单元格?

I do not understand what that sentence means. Can anyone exlain to me why it is not possible to set the selection to a cell below or above?

推荐答案


当我尝试ViewerCell.ABOVE或ViewerCell.BELOW时,nextCell实际上是
设置为上方或下方的单元格,但在GUI中,选择保持在
currentSelectedCell。

When I try ViewerCell.ABOVE or ViewerCell.BELOW nextCell is actually set to the cell above or below, but in the GUI the selection stays at currentSelectedCell.

您必须在 KEY_PRESSED 事件后明确设置当前选择。现在有两种方法可以做到。

You have to explicitly set the current selection after the KEY_PRESSED event. Now there are two ways to do it.


  1. v.getTable()。showColumn(v.getTable() .getColumn(nextCell.getColumnIndex())); 其中是表查看器对象。现在这种方法通常适用于简单的键,如 SWT.ARROW_DOWN SWT.ARROW_UP 等。但回车即 SWT.CR 通常有一些特殊的含义,如提交表格,按复合材料上的默认按钮等。我没有彻底检查,但我的直觉感觉它是由一些人处理的其他处理程序,因此你失去焦点。

  2. 对于 SWT.CR 使用此: v.getTable() .setSelection(((TableItem)nextCell.getItem()));

  1. v.getTable().showColumn(v.getTable().getColumn(nextCell.getColumnIndex())); where is the table viewer object. Now this approach normally works with the simple keys like SWT.ARROW_DOWN, SWT.ARROW_UP etc. But carriage return i.e. SWT.CR usually has some special meaning like submitting a form, pressing a default button on the composite etc. I haven't checked thoroughly but my gut feeling says it is handled by some other handler and hence you lose focus.
  2. For SWT.CR use this: v.getTable().setSelection(((TableItem)nextCell.getItem()));

此外,你必须覆盖 CellNavigationStrategy.isNavigationEvent(),否则 SWT.CR SWT.KEYPAD_CR 将被忽略。例如:

Also you have to override the CellNavigationStrategy.isNavigationEvent(), otherwise SWT.CR and SWT.KEYPAD_CR would be ignored. For example:

@Override
public boolean isNavigationEvent(ColumnViewer viewer, Event event) {
    return event.keyCode == SWT.CR || event.keyCode == SWT.KEYPAD_CR;
}


我不明白那句话是什么意思。

I do not understand what that sentence means.

这意味着如果你要使用JFace附带的 CellNavigationStrategy 的默认实现,则无法处理 SWT.PAGE_DOWN 按键事件。原因是它不在 CellNavigationStrategy.isNavigationEvent()中处理(有关详细信息,请参阅其实现)。

It means that if you are going to use the default implementation of CellNavigationStrategy, which is shipped with JFace then it is not possible to handle the SWT.PAGE_DOWN key press event. The reason is that it is not handled in CellNavigationStrategy.isNavigationEvent() (see its implementation for more details).



请参阅下面的完整工作代码:


See the full working code below:

import org.eclipse.jface.viewers.*;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.*;

public class CellNavTest {
    public CellNavTest(Shell shell)
    {
        final TableViewer v = new TableViewer(shell, SWT.BORDER | SWT.FULL_SELECTION);
        v.setContentProvider(new MyContentProvider());

        TableViewerColumn column = new TableViewerColumn(v, SWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("Givenname");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new ColumnLabelProvider() {

            public String getText(Object element) {
                return ((Person) element).givenname;
            }
        });

        column = new TableViewerColumn(v, SWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("Surname");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new ColumnLabelProvider() {

            public String getText(Object element) {
                return ((Person) element).surname;
            }

        });

        column = new TableViewerColumn(v, SWT.NONE);
        column.getColumn().setWidth(200);
        column.getColumn().setText("E-Mail");
        column.getColumn().setMoveable(true);
        column.setLabelProvider(new ColumnLabelProvider() {

            public String getText(Object element) {
                return ((Person) element).email;
            }

        });

        CellNavigationStrategy naviStrat = new CellNavigationStrategy() 
        {

            @Override
            public boolean isNavigationEvent(ColumnViewer viewer, Event event) {
                return event.keyCode == SWT.CR || event.keyCode == SWT.KEYPAD_CR;
            }

            public ViewerCell findSelectedCell(ColumnViewer viewer, ViewerCell currentSelectedCell, Event event)
            {
                if (event.type == ColumnViewerEditorActivationEvent.KEY_PRESSED) {
                    if (event.keyCode == SWT.CR  || event.keyCode == SWT.KEYPAD_CR) 
                    {
                        ViewerCell nextCell = currentSelectedCell.getNeighbor(ViewerCell.BELOW, false);
                        if(nextCell != null) 
                        {
                            /*
                             * START
                             * Shows the column. If the column is already showing in the receiver, this method simply returns. 
                             * Otherwise, the columns are scrolled until the column is visible. So when you press enter it will just
                             * return the same column index and hence as per javadoc it will just return.
                             */
                            //System.out.println(nextCell.getColumnIndex());
                            //v.getTable().showColumn(v.getTable().getColumn(nextCell.getColumnIndex()));
                            /*
                             * END
                             */

                            if(nextCell.getItem() instanceof TableItem)
                                v.getTable().setSelection(((TableItem)nextCell.getItem()));
                        }
                        return nextCell;
                    }
                }
                return null;
            }

        };

        new TableViewerFocusCellManager(v, new FocusCellOwnerDrawHighlighter(v), naviStrat);    

        Person[] model = createModel();
        v.setInput(model);
        v.getTable().setLinesVisible(true);
        v.getTable().setHeaderVisible(true);
    }

    private Person[] createModel() {
        Person[] elements = new Person[4];
        elements[0] = new Person("Tom", "Schindl",
                "tom.schindl@bestsolution.at", "M");
        elements[1] = new Person("Boris", "Bokowski",
                "Boris_Bokowski@ca.ibm.com","M");
        elements[2] = new Person("Tod", "Creasey", "Tod_Creasey@ca.ibm.com","M");
        elements[3] = new Person("Wayne", "Beaton", "wayne@eclipse.org","M");

        return elements;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        Display display = new Display();

        Shell shell = new Shell(display);
        shell.setLayout(new FillLayout());
        new CellNavTest(shell);
        shell.open();

        while (!shell.isDisposed()) {
            if (!display.readAndDispatch())
                display.sleep();
        }

        display.dispose();

    }
}

class MyContentProvider implements IStructuredContentProvider {

    public Object[] getElements(Object inputElement) {
        return (Person[]) inputElement;
    }
    public void dispose() {
    }
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
    }
}

class Person {
    public String givenname;
    public String surname;
    public String email;
    public String gender;
    public Person(String givenname, String surname, String email, String gender) {
        this.givenname = givenname;
        this.surname = surname;
        this.email = email;
        this.gender = gender;
    }

}

这篇关于如何使用SWT TableViewer中的enter键向下导航的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆