SWT Table
有void setTopIndex(int index)
和int getTopIndex()
。
我真的需要setTopPixel(int pixel)
或setTopIndexFractional(double index)
。
我尝试将Table
放入ScrolledComposite
,因此:
public class PixelTable extends ScrolledComposite {
private final Table table;
private final double itemHeight;
public PixelTable(Composite parent) {
super(parent, SWT.V_SCROLL | SWT.BORDER);
// setup the ScrolledComposite
table = new Table(this, SWT.VIRTUAL);
this.setExpandHorizontal(true);
this.setContent(table);
itemHeight = table.getItemHeight();
// setup the Table
table.setLinesVisible(true);
table.addListener(SWT.SetData, new Listener() {
@Override
public void handleEvent(Event e) {
int row = e.index;
TableItem item = (TableItem) e.item;
item.setText(Integer.toString(row));
}
});
}
/** Returns the fractional top index. */
public double getTopIndex() {
return getOrigin().y / itemHeight;
}
/** Sets the fractional top index. */
public void setTopIndex(double top) {
this.setOrigin(0, (int) Math.round(top * itemHeight));
}
/** Sets the item count. */
public void setItemCount(int count) {
table.setItemCount(count);
Point size = table.computeSize(SWT.DEFAULT, SWT.DEFAULT);
table.setSize(size);
}
}
这适用于while,但一旦内部Table
的大小超过~65,000像素(~2,500行),Table
也会显示其滚动条(可能是在原生方的某处无符号短路)。另外,使用这种方法使表头符号变得非常棘手,因为它们会滚动起来。
是否有人知道将每像素接口添加到SWT API会出现什么问题(或如何开始)?如有必要,我愿意分支SWT源。我只关心Win / OS X / Linux的最新API(例如,如果我不得不破坏与旧东西的兼容性,我就不在乎。)
答案 0 :(得分:0)
如果您想要按像素滚动,那么只需自己滚动即可。您需要做的就是倾听SWT.MouseWheel
,将Event#doit
设置为false
,然后根据滚动方向设置ScrollBar
的选择(增加/减少1( < - 那是一个像素))。
以下是一个例子:
public static void main(String[] args)
{
final Display display = new Display();
final Shell shell = new Shell(display);
shell.setText("StackOverflow");
shell.setLayout(new FillLayout());
final Table table = new Table(shell, SWT.V_SCROLL);
for (int i = 0; i < 100; i++)
new TableItem(table, SWT.NONE).setText("Item: " + i);
table.addListener(SWT.MouseWheel, new Listener()
{
@Override
public void handleEvent(Event e)
{
int increment = table.getVerticalBar().getSelection();
if (e.count < 0)
increment++;
else if (e.count > 0)
increment--;
table.getVerticalBar().setSelection(increment);
e.doit = false;
}
});
shell.pack();
shell.setSize(400, 200);
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
{
display.sleep();
}
}
display.dispose();
}