Прокрутка таблицы SWT на пиксель

#java #swt

#java #swt

Вопрос:

SWT Table имеет void setTopIndex(int index) и int getTopIndex() .

Мне действительно нужен setTopPixel(int pixel) or 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);
    }
}
  

Какое-то время это работает, но как только внутренний Table размер становится больше ~ 65 000 пикселей (~ 2500 строк), Table также отображается полоса прокрутки (вероятно, где-то на родной стороне беззнаковое сокращение). Кроме того, будет довольно сложно заставить заголовки таблиц работать с этим подходом, поскольку они будут прокручиваться.

Кто-нибудь знает, какие могут возникнуть проблемы (или с чего начать) при добавлении интерфейса для каждого пикселя в SWT API? При необходимости я готов разветвлять исходный код SWT. Меня интересуют только новейшие API для Win / OS X / Linux (например, меня не волнует, придется ли мне нарушать совместимость со старыми материалами).

Ответ №1:

Если вам нужна прокрутка по пикселям, то просто выполните прокрутку самостоятельно. Все, что вам нужно сделать, это прослушать 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();
}
  

Комментарии:

1. Ваш ответ хорошо прокручивает полосу прокрутки, но таблица не прокручивается. Если я щелкаю и перетаскиваю полосу прокрутки в вашем примере, она продолжает прокручивать таблицу отдельными строками, а не по пикселям. Я тестировал на Windows 7 и 8, SWT 3.7

2. @NedTwigg Ах, да. Мой код обрабатывает прокрутку с помощью колесика мыши. Я посмотрю, смогу ли я заставить это работать и при перетаскивании.

3. @NedTwigg Боюсь, что это невозможно сделать с помощью общедоступных методов API. Подклассы ScrollBar и Table могли бы помочь, но я не собираюсь идти по этому пути.

4. Создание подклассов! Хорошая идея, я об этом не подумал. Я посмотрю на этот путь через пару дней и опубликую свои результаты здесь.