Как обнаружить изменения видимости полосы прокрутки SWT Table - PullRequest
1 голос
/ 15 апреля 2011

Как я могу определить, когда вертикальная полоса прокрутки Java SWT Table становится видимой?Мне нужна эта информация для пересчета ширины столбцов.Похоже, что никакие события (кроме выбора) никогда не запускаются на полосах прокрутки.

Ответы [ 3 ]

3 голосов
/ 18 апреля 2011

Я думаю, вы правильно выяснили, что нет простого способа обнаружить when the vertical ScrollBar is visible. В любом случае, решение, представленное здесь, является своего рода взломом.

Я использую концепцию, представленную в этом фрагменте SWT , вычисляет видимые строки в таблице . Наряду с этим я также использую SWT Paint Event.

Основная концепция выглядит следующим образом:

  1. Рассчитать количество видимых строк (элементов).
  2. Сравните это с общим количеством строк (предметов).
  3. Делайте все это в некотором событии, которое происходит с добавлением строк (элементов). Я выбрал SWT Paint Event

>> Код

import org.eclipse.swt.*;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.*;
import org.eclipse.swt.widgets.*;

public class TableScrollVisibilityTest 
{
    private static int count;

    public static void main(String [] args) 
    {
        Display display = new Display();
        Shell shell = new Shell(display);
        shell.setBounds(10,10,300,300);
        shell.setLayout(new GridLayout(2,true));

        final Table table = new Table(shell, SWT.NONE);
        GridData data = new GridData(GridData.FILL_BOTH);
        data.horizontalSpan = 2;
        table.setLayoutData(data);

        count = 0;

        final Button addItem = new Button (shell, SWT.PUSH);
        addItem.setText ("Add Row");
        data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 2;
        addItem.setLayoutData(data);

        final Text text = new Text(shell, SWT.BORDER);
        text.setText ("Vertical Scroll Visible - ");
        data = new GridData(SWT.FILL, SWT.FILL, true, false);
        data.horizontalSpan = 2;
        text.setLayoutData(data);


        addItem.addListener (SWT.Selection, new Listener () 
        {
            public void handleEvent (Event e) 
            {
                new TableItem(table, SWT.NONE).setText("item " + count);
                count++;
            }
        });


        table.addPaintListener(new PaintListener() {
            public void paintControl(PaintEvent e) {
                Rectangle rect = table.getClientArea ();
                int itemHeight = table.getItemHeight ();
                int headerHeight = table.getHeaderHeight ();
                int visibleCount = (rect.height - headerHeight + itemHeight - 1) / itemHeight;
                text.setText ("Vertical Scroll Visible - [" + (table.getItemCount()>= visibleCount)+"]");

                      // YOUR CODE HERE
            }
        });


        shell.open();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) display.sleep();
        }

        display.dispose();
    }

}

>> Вывод

Для itemcount <количество видимых строк </strong>

sample 1

Для itemcount> = количество видимых строк

sample 2

Примечание- Если вы собираетесь использовать событие рисования, попробуйте сохранить вычисления минимальными, как это часто вызывается.

Надеюсь, это поможет.

2 голосов
/ 05 октября 2014

Это работает для меня:

 boolean isScrollVisible = table.getVerticalBar().getVisible();
 Point vBarSize = table.getVerticalBar().getSize();
 int width_diff = 
      current_width.x - totalColumnWidth - (isScrollVisible ? vBarSize.x : 0 );
0 голосов
/ 20 декабря 2012

Я обнаружил, что после уведомления об изменении размера вы можете определить разницу между границами и клиентской областью прокрутки.Разница в любом измерении должна предполагать наличие полосы прокрутки.

...