我有一个奇怪的问题,

我有一张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您可以使编辑器了解正在编辑的项目。表。

10-07 13:11