我有一个奇怪的问题,
我有一张2列3行的桌子
每个单元格文本都可以在运行时进行编辑,当我在第三行第二列中编辑单元格时,我也用相同的文本修改了上部单元格
这仅发生在redhat6上。与rhe5和rhe4一起正常工作
TextCellEditor类型的编辑器;
TableItem item = table.getItem(textEditor.getControl().getLocation());
Table.class中的getItem方法实现为:
public TableItem getItem (Point point) {
checkWidget();
if (point == null) error (SWT.ERROR_NULL_ARGUMENT);
int /*long*/ [] path = new int /*long*/ [1];
OS.gtk_widget_realize (handle);
if (!OS.gtk_tree_view_get_path_at_pos (handle, point.x, point.y, path,null, null, null)) return null;
if (path [0] == 0) return null;
int /*long*/ indices = OS.gtk_tree_path_get_indices (path [0]);
TableItem item = null;
if (indices != 0) {
int [] index = new int [1];
OS.memmove (index, indices, 4);
item = _getItem (index [0]);
}
OS.gtk_tree_path_free (path [0]);
return item;
}
我以为可能是我的GTK库。我已经安装了GTK2 lib。
最佳答案
我认为触发此错误是因为Text
字段内的TextEditorField
具有一些不适合单元格的边距或最小大小,或者行高计算不正确。
但是,我建议您不要尝试使用getItem(Point)
查找文本编辑器指向的表项,因为可能还会存在其他类型的问题,并且通常无法保证这种行为。我要说的是,该方法主要用于查找“鼠标指向的一项”。如this question here中所示。实际上,您可以算是很幸运,因为您确实发现了此错误。
快速而又肮脏的解决方案是计算Text.getBounds()
的中心,并使用它来找到该项目,即:
Rectangle bounds = textEditor.getControl().getBounds();
Point location = new Point(bounds.x + bounds.width / 2, bounds.y + bounds.height / 2);
table.getItem(location);
但是更好的选择是,如果您正在运行SWT> = 3.3,则可以使用
TableViewerColumn.setEditingSupport(EditingSupport)
为每一列设置EditingSupport
,因为使用EditingSupport
您可以使编辑器了解正在编辑的项目。表。