【问题标题】:How to detect SWT Table's scroll bar visibility changes如何检测 SWT Table 的滚动条可见性变化
【发布时间】:2011-04-15 08:31:50
【问题描述】:

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

【问题讨论】:

    标签: java events swt visible


    【解决方案1】:

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

    我正在使用此 SWT sn-p compute the visible rows in a table 中提出的概念。除此之外,我还使用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

    对于 itemcount >= numberofvisible rows

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

    希望这会有所帮助。

    【讨论】:

    • 使用绘画事件是个好主意!我没有想到这一点。感谢您的出色解决方案!
    • 我发现每当滚动条的可见性发生变化时,都会抛出一个 SWT.RESIZE 事件,所以你也可以使用它。
    【解决方案2】:

    这对我有用:

     boolean isScrollVisible = table.getVerticalBar().getVisible();
     Point vBarSize = table.getVerticalBar().getSize();
     int width_diff = 
          current_width.x - totalColumnWidth - (isScrollVisible ? vBarSize.x : 0 );
    

    【讨论】:

    • 问题是关于检测 change 的可见性,例如通过一些事件。
    • 当然我在 ControlAdapter 的 controlResized 方法中使用了这个。我以为很清楚。 tableviewer.getTable().addControlListener( new ControlAdapter(){ public void controlResized( ControlEvent e ){ boolean visible = tableviewer.getTable().getVerticalBat().getVisible(); } });我发现很少有人提到表格有这么简单的方法来知道滚动条是否可见。无需计算外部容器的大小,或计算表中的项目...
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-09
      • 2011-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-08
      相关资源
      最近更新 更多