1

如何检测 Java SWT Table 的垂直 ScrollBar 何时变得可见?我需要这些信息来重新计算列的宽度。似乎在 ScrollBars 上没有触发任何事件(除了选择)。

4

3 回答 3

3

我想你已经正确地发现没有简单的检测方法when the vertical ScrollBar is visible。无论如何,这里提供的解决方案是一种 hack。

我正在使用这个 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 < 可见行数

样品 1

对于itemcount >= numberofvisible 行

样品 2

注意 -如果您要使用绘制事件,请尝试将计算保持在最低限度,因为它经常被调用。

希望这会有所帮助。

于 2011-04-18T05:51:05.123 回答
2

这对我有用:

 boolean isScrollVisible = table.getVerticalBar().getVisible();
 Point vBarSize = table.getVerticalBar().getSize();
 int width_diff = 
      current_width.x - totalColumnWidth - (isScrollVisible ? vBarSize.x : 0 );
于 2014-10-05T18:01:58.617 回答
0

我发现,根据调整大小通知,您可以获取 Scrollable 的边界和客户区域之间的差异。任一维度的差异应该表明存在滚动条。

于 2012-12-20T14:23:44.807 回答