Дискретная прокрутка в таблице SWT

Как сделать дискретную (построчную) прокрутку в 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() строки размещаются неправильно.

Можно ли это сделать более точным образом?


person While True    schedule 29.03.2014    source источник


Ответы (1)


Насколько я могу судить, добавление 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.

person Baz    schedule 30.03.2014