SWT表每像素滚动

时间:2014-07-05 23:58:59

标签: java swt

SWT Tablevoid 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(例如,如果我不得不破坏与旧东西的兼容性,我就不在乎。)

1 个答案:

答案 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();
}