4

私たちの Eclipse RCP 3.7 アプリケーションでは、Excel ファイルを読み込んでテーブルの最初の 30 行を表示します。レンダリングの問題は行ではなく列の数にあり、テーブルが特定のサイズに達したときはそうではありません。正しく描画されているように見えず、右にスクロールすると、セルとヘッダーの位置がずれて、全体が狂ってしまいます。

以下のスタンドアロン クラスは、この問題を示しており、問題が発生した場合に備えて、アプリで使用した基本的なパターンに従います。

これを解決する方法について何か考えはありますか?

import java.util.ArrayList;
import java.util.List;

import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.StyledCellLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.TableViewerColumn;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;



public class Snippet {

    public static TableViewer viewer;

    public static void main( String[] args ) {
        Display display = new Display();
        Shell shell = new Shell( display );
        shell.setLayout( new FillLayout() );
       viewer = new TableViewer(shell, SWT.FULL_SELECTION | SWT.H_SCROLL
                | SWT.V_SCROLL);
        Table table = viewer.getTable();
        table.setLinesVisible(true);
        table.setHeaderVisible(true);

        viewer.setContentProvider(new ArrayContentProvider());
        createColumns(300);
        viewer.setInput(generateData(300, 30));
        for (TableColumn c : viewer.getTable().getColumns()) {
            c.pack();
        }


        shell.setSize( 300, 500 );
        shell.open();
        while( !shell.isDisposed() ) {
            if( !display.readAndDispatch() ) {
                display.sleep();
            }
        }
        display.dispose();
    }

    private static void createColumns(int columnCount) {

        for (int i = 0; i < columnCount; i++) {
            createTableViewerColumn(i);

        }
    }

    private static TableViewerColumn createTableViewerColumn(int colNum) {
        final TableViewerColumn viewerColumn = new TableViewerColumn(viewer,
                SWT.NONE);
        final TableColumn column = viewerColumn.getColumn();
        column.setText("Table Header " + colNum);
        column.setWidth(100);
        column.setResizable(true);
        column.setMoveable(false);
        viewerColumn.setLabelProvider(new Snippet.SampleDataTableCellProvider(colNum));
        return viewerColumn;
    }

    private static List<String[]> generateData(int cols, int rows) {
        ArrayList<String[]> result = new ArrayList<String[]>();
        for  (int y = 0; y < rows; y++) {
            String[] row = new String[cols];
            for  (int x = 0; x < cols; x++) {
                row[x] = "Big long string to test how long these columns can go before it all goes mental.";
            }
            result.add(row);
        }
        return result;
    }

    private static class SampleDataTableCellProvider extends StyledCellLabelProvider {

        private int colnumber;

        private SampleDataTableCellProvider(int colnumber) {
            this.colnumber = colnumber;
        }

        @Override
        public void update(ViewerCell cell) {

            String[] row = (String[]) cell.getElement();
            if (row.length > colnumber) {
                cell.setText(row[colnumber]);
            } else {
                cell.setText("");
            }

            super.update(cell);
        }


    }
}
4

2 に答える 2

5

TableViewerスクロール中にコンテンツを十分に速く更新およびレンダリングできないと思います。

SWT.VIRTUALJFace ビューア用のスタイル プロバイダと遅延コンテンツ プロバイダを試してみることができます。

TableViewerの javadoc から:

3.1 以降、TableViewer は SWT.VIRTUAL フラグをサポートするようになりました。基になるテーブルが SWT.VIRTUAL の場合、コンテンツ プロバイダーは IStructuredContentProvider の代わりに ILazyContentProvider を実装する場合があります。

スタイルを持つ は、 を使用してTableViewer、オンデマンドでコンテンツを作成および表示できます。並べ替えやフィルタリングの制限など、仮想ビューアーを使用した場合の副作用については、javadoc を参照してください。SWT.VIRTUALILazyContentProvider

このブログエントリも参照してください: JFace's Viewers Performances .

標準TableViewerは列ではなく行をキャッシュGridTableViewerするため、多くの列を扱う問題には Nebula の方が適しているようです。可視セルについて通知し、 で使用できますLazyColumnLabelProvider

Nebula を使用したソリューションについては、次のGridTableViewer記事を参照してください: JFace-Viewer and Eclipse Databinding with > 10.000 Objects

于 2012-12-19T19:07:49.933 に答える
-1

これは同様の問題のようです。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=124965

于 2012-12-20T04:47:02.093 に答える