2011-04-15 79 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