以编程方式滚动SWT表

时间:2010-08-20 13:09:33

标签: swt

如何以编程方式垂直滚动SWT表? 我正在桌子上实现搜索功能。找到某个项目后,它将滚动到找到的项目。

3 个答案:

答案 0 :(得分:32)

您可能想尝试几种方法:

Table.showItem(TableItem)
Table.showSelection()
Table.showColumn(TableColumn)
Table.setTopIndex(int)

除此之外,我建议使用JFace中的TableViewer。然后你用这种方法滚动到一个项目:

TableViewer.reveal(Object)

答案 1 :(得分:1)

我的全职工作是开发SWT(在Linux上),我希望能够提供全面的答案:

从SWT代码的角度来看(至少在GTK上),只有3个Table函数通过内部本机调用gtk_tree_view_scroll_to_*()

影响滚动
setTopIndex();
showSelection();
showColumn();

解释他们的所作所为&如何使用它们:

垂直滚动

这可以通过设置焦点或选择特定的表项来完成。

表:

setTopIndex(int)      // Btw for Tree it's setTopItem(..)
showSelection()  // which is also reached via setSelection().

setTopIndex(int)以编程方式将视图移动到所需位置。

以下是执行所需作业的[Snippet52] [1]的修改版本:

public static void main (String [] args) {
        Display display = new Display ();
        Shell shell = new Shell (display);
        Table table = new Table (shell, SWT.BORDER | SWT.MULTI);
        Rectangle clientArea = shell.getClientArea ();
        table.setBounds (clientArea.x, clientArea.y, 200, 200);
        for (int i=0; i<128; i++) {
            TableItem item = new TableItem (table, SWT.NONE);
            item.setText ("Item " + i);
        }
        table.setTopIndex(95);   // <<<< This is the interesting line.
        shell.pack ();
        shell.open ();
        while (!shell.isDisposed ()) {
            if (!display.readAndDispatch ()) display.sleep ();
        }
 }
另一方面,

showSelection()将视图滚动到当前所选项目。各种setSelection(..)方法也调用此方法。

I.e setSelection(..)通常用于滚动到所需的项目并在其上设置键盘焦点。如果您在树中搜索某个项目并希望用户输入(例如输入&#39;)以对您找到的项目执行操作,则此功能非常有用。 Snippet52(如上所述)执行此任务。

现在值得注意的是setSelection(..)没有触发selectionListeners(...),因此调用此方法不会调用相关的操作。

水平滚动

这是通过&#39; showColumn()&#39;专注于特定列来完成的。

下面是一个示例代码段,可以创建一些行和列然后 滚动到最后一列。

    public static void main (String [] args) {
          Display display = new Display ();
            Shell shell = new Shell (display);
            Table table = new Table (shell, SWT.BORDER | SWT.MULTI);
            table.setHeaderVisible (true);
            Rectangle clientArea = shell.getClientArea ();
            table.setBounds (clientArea.x, clientArea.y, 100, 100);
            String[] titles = {"First", "Second", "Third", "Fourth", "Fifth"};
            for (int i=0; i<titles.length; i++) {
                TableColumn column = new TableColumn (table, SWT.NONE);
                column.setText (titles [i]);
            }
            for (int i=0; i<128; i++) {
                TableItem item = new TableItem (table, SWT.NONE);
            item.setText (new String [] {"" + i, ""+i, ""+i, ""+i});
            }
            for (int i=0; i<titles.length; i++) {
                table.getColumn (i).pack ();
            }

            shell.pack ();
            shell.open ();

            display.asyncExec(
                    // Sometimes table column sizes are computed later at runtime,
                    // to get around it, set the column index after initialization.
                    () -> table.showColumn(table.getColumn(4))
            );
            while (!shell.isDisposed ()) {
                if (!display.readAndDispatch ()) display.sleep ();
            }
            display.dispose ();
        }

关于树和列表的注释

在SWT内部,树/表/列表都使用相同的本地树&#39;树。窗口小部件。

以上示例也可用于列表和表格,区别在于:

  • 在树中,setTopIndex(..)setTopItem(..)
  • 列表中没有列,因此showColumn()不适用。

如果您还有其他问题,请与我们联系。

答案 2 :(得分:0)

我真的不知道您需要搜索什么,但您也可以考虑过滤表格以获得您想要的元素(有点像快速搜索)。

检查出来: http://eclipsesource.com/blogs/2012/10/26/filtering-tables-in-swtjface/

希望它有所帮助,欢呼!