Java SWT表中的离散滚动

Java SWT表中的离散滚动,java,swt,jface,tableviewer,Java,Swt,Jface,Tableviewer,如何在SWT表格(JFace表格查看器)中进行离散(逐行)滚动 我需要一个表格“一次滚动一行”,在上面放一个完整的单元格 我使用JFaceTableViewer,但我没有找到向其中添加鼠标侦听器的方法,因此我制作了如下内容: TableViewer table = new TableViewer(shell, SWT.BORDER_DASH |SWT.FULL_SELECTION); //some visual settings ommited here table.getControl().a

如何在SWT
表格
(JFace
表格查看器
)中进行离散(逐行)滚动

我需要一个
表格
“一次滚动一行”,在上面放一个完整的单元格

我使用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()
没有正确放置行


可以用更准确的方法吗?

据我所知,在
监听器中添加
e.doit=false
非常有效。以下是一个例子:

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();
}
publicstaticvoidmain(字符串[]args)
{
最终显示=新显示();
外壳=新外壳(显示);
shell.setText(“StackOverflow”);
setLayout(新的FillLayout());
最终表格=新表格(壳牌,SWT.无);
对于(int i=0;i<100;i++)
{
TableItem项目=新的TableItem(表,SWT.NONE);
项目.setText(“项目”+i);
}
table.addListener(SWT.mouseweel,newlistener()
{
@凌驾
公共无效handleEvent(事件e)
{
e、 doit=false;
如果(如计数>=0)
table.setTopIndex(table.getTopIndex()-1);
其他的
table.setTopIndex(table.getTopIndex()+1);
}
});
shell.pack();
shell.setSize(shell.getSize().x,300);
shell.open();
而(!shell.isDisposed())
{
如果(!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
顶部的
TableItem
未完全显示的唯一情况是,当您到达
表格的末尾时,表格的高度不是
TableItem
高度的精确倍数