2011-04-15 54 views

回答

2

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

我正在使用本SWT片段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 < numberofvisible行

sample 1

对于ITEMCOUNT> = numberofvisible行

​​

注意 -如果你要使用的油漆事件,然后尝试保持最低的计算,因为它是频繁调用。

希望这会有所帮助。

+0

使用Paint事件是一个好主意!我没有想到这一点。感谢您的伟大解决方案! – 2011-04-18 08:02:16

+0

我发现只要滚动条的可见性发生变化,就会引发SWT.RESIZE事件,因此您也可以使用它。 – Zordid 2012-11-06 15:38:16

0

我发现,在调整大小的通知后,您可以区分Scrollable的边界和客户区域。任何一个维度的差异都应该表明存在一个滚动条。

2

这个工作对我来说:

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

问题是关于检测*改变*是否可见,例如通过一些事件。 – 2014-10-05 19:39:05

+2

当然,我使用了ControlAdapter的controlResized方法。 我认为这很清楚。 tableviewer.getTable()。addControlListener( \t新的ControlAdapter(){ \t \t公共无效controlResized(ControlEvent资料发送){ \t \t \t布尔可见= tableviewer.getTable()。。getVerticalBat()getVisible(); \t \t \t \t} }); 我发现很少有人提到该表具有知道滚动条是否可见的简单方法。 无需计算外部容器的大小,或计算表中的项目... – Alex 2015-04-18 09:33:51