如何在 SWT TableViewer 中使用 Enter 键向下导航
我有一个 TableViewer
,并且希望在按下 Enter 键时选择向下一个单元格,就像在 MS Excel 中一样。我使用以下 findSelectedCell
实现了自己的 CellNavigationStrategy
。
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
处。
findSelectedCell 的 API 文档说:
退货:
下一个突出显示的单元格,如果默认则为 null 已采取实施。例如,它几乎不可能做出反应 PAGE_DOWN 请求
我不明白那句话是什么意思。谁能向我解释为什么无法将选择设置为下方或上方的单元格?
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;
}
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
.
The API-Documentation for findSelectedCell says:
Returns:
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?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您必须在
KEY_PRESSED
事件之后显式设置当前选择。现在有两种方法可以做到这一点。v.getTable().showColumn(v.getTable().getColumn(nextCell.getColumnIndex()));
其中是表查看器
对象。现在,这种方法通常适用于简单的按键,如SWT.ARROW_DOWN
、SWT.ARROW_UP
等。但是回车符,即SWT.CR
通常有一些特殊含义,例如提交表单、按组合上的默认按钮等。我没有彻底检查,但我的直觉说它是由其他处理程序处理的,因此你会失去焦点。SWT.CR
使用:v.getTable().setSelection(((TableItem)nextCell.getItem()));
另外,您还必须覆盖
CellNavigationStrategy.isNavigationEvent()
,否则SWT.CR
和SWT.KEYPAD_CR
将被忽略。例如:这意味着,如果您要使用 JFace 附带的
CellNavigationStrategy
的默认实现,则无法处理SWT.PAGE_DOWN
按键事件。原因是它没有在CellNavigationStrategy.isNavigationEvent()
中处理(有关更多详细信息,请参阅其实现)。See the full working code below:
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()));
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.SWT.CR
use this:v.getTable().setSelection(((TableItem)nextCell.getItem()));
Also you have to override the
CellNavigationStrategy.isNavigationEvent()
, otherwiseSWT.CR
andSWT.KEYPAD_CR
would be ignored. For example: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 theSWT.PAGE_DOWN
key press event. The reason is that it is not handled inCellNavigationStrategy.isNavigationEvent()
(see its implementation for more details).See the full working code below: