如何使用SWT TableViewer中的enter键向下导航 [英] How to navigate down with enter key in SWT TableViewer
问题描述
我有一个 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.
-
v.getTable()。showColumn(v.getTable() .getColumn(nextCell.getColumnIndex()));
其中是表查看器
对象。现在这种方法通常适用于简单的键,如SWT.ARROW_DOWN
,SWT.ARROW_UP
等。但回车即SWT.CR
通常有一些特殊的含义,如提交表格,按复合材料上的默认按钮等。我没有彻底检查,但我的直觉感觉它是由一些人处理的其他处理程序,因此你失去焦点。 - 对于
SWT.CR
使用此:v.getTable() .setSelection(((TableItem)nextCell.getItem()));
v.getTable().showColumn(v.getTable().getColumn(nextCell.getColumnIndex()));
where is thetable viewer
object. Now this approach normally works with the simple keys likeSWT.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.- 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屋!