1

Java SWT テーブルの垂直スクロールバーがいつ表示されるかを検出するにはどうすればよいですか? 列の幅を再計算するには、その情報が必要です。ScrollBars でイベント (Selection 以外) が発生することはないようです。

4

3 に答える 3

3

を検出する簡単な方法がないことを正しく認識していると思います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 < numberofvisible 行の場合

サンプル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 に答える