如何在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()
没有正确放置行。
能以更准确的方式完成吗?
答案 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
高度的确切倍数。