Table.getItem returns 错误项仅在 RHEL6 中

Table.getItem returns wrong item only in RHEL6

我有一个奇怪的问题,

我有一个 2 列 3 行的 table 每个单元格文本都可以在 运行 时间编辑,当我编辑第 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 库。

我认为触发此错误是因为 TextEditorField 字段中的 Text 有一些边距或最小尺寸不适合单元格,或者行高计算不正确。

但是,我建议您不要尝试使用 getItem(Point) 来查找文本编辑器指向的 table 项,因为可能还有其他类型的问题,并且通常不能保证这种行为。我会说应该主要用于查找 "the one item that is being pointed to at by mouse.",如 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) to set the EditingSupport,因为使用 EditingSupport 可以让编辑器了解它正在编辑 table.

中的哪个项目