SWT表中的离散滚动

时间:2014-03-29 19:42:57

标签: java swt jface tableviewer

如何在SWT Table(JFace TableViewer)中进行离散(逐行)滚动?

我需要一个Table滚动“一次一个不间断的行”,将一个完整的单元格放在最上面。

我使用JFace TableViewer,但我找不到添加鼠标监听器的方法,所以我做了这样的事情:

TableViewer table = new TableViewer(shell, SWT.BORDER_DASH |SWT.FULL_SELECTION);
//some visual settings ommited here
table.getControl().addMouseWheelListener(new MouseWheelListener() {

        @Override
        public void mouseScrolled(MouseEvent e) {
            Table sourceControl = (Table)e.getSource();
            System.out.println(e.count);
            if(e.count >=0)
                sourceControl.setTopIndex(sourceControl.getTopIndex()-1);
            else
                sourceControl.setTopIndex(sourceControl.getTopIndex()+1);
        }
    });

但事实证明,首先如果e.count等于3或更多,则会错过某些行。其次有时setTopIndex()没有正确放置行。

能以更准确的方式完成吗?

1 个答案:

答案 0 :(得分:0)

据我所知,在e.doit = false中添加Listener效果非常好。这是一个例子:

public static void main(String[] args)
{
    final Display display = new Display();
    Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new FillLayout());

    final Table table = new Table(shell, SWT.NONE);

    for (int i = 0; i < 100; i++)
    {
        TableItem item = new TableItem(table, SWT.NONE);
        item.setText("Item " + i);
    }

    table.addListener(SWT.MouseWheel, new Listener()
    {
        @Override
        public void handleEvent(Event e)
        {
            e.doit = false;
            if (e.count >= 0)
                table.setTopIndex(table.getTopIndex() - 1);
            else
                table.setTopIndex(table.getTopIndex() + 1);
        }
    });

    shell.pack();
    shell.setSize(shell.getSize().x, 300);
    shell.open();

    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

唯一一个顶部的TableItem未完全显示的情况是当您到达Table的末尾并且表格的高度不是TableItem高度的确切倍数。