2

JFace TableViewer でラップされた SWT テーブルがあります。列全体を右揃えにする方法を知っています:

TableColumn column = new TableColumn(viewer.getTable(), SWT.RIGHT);

ただし、入力に応じてセルごとに配置を変更したいのですが、基本的には、数字を含むセルのみを右揃えにしたいと考えています。

私はこれをスニペットで試してきました(http://wiki.eclipse.org/JFaceSnippets#Snippet016TableLayoutから取得)。このテーブルは CellLabelProvider を使用します。update(ViewerCell cell)このメソッドでは、セルごとに背景色などを設定できるため、メソッドの配置を変更できると思いました。しかし、私は生産するのに適したものを見つけることができません。

助言がありますか?以下の完全なスニペット。

import org.eclipse.jface.layout.TableColumnLayout;
import org.eclipse.jface.viewers.CellLabelProvider;
import org.eclipse.jface.viewers.ColumnWeightData;
import org.eclipse.jface.viewers.IStructuredContentProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.jface.viewers.ViewerCell;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;

/**
 * Snippet for alignment in a table viewer.
 */
public class TableViewerAlignmentSnippet {

  private class MyContentProvider implements IStructuredContentProvider {
    public Object[] getElements(final Object inputElement) {
      return (MyModel[]) inputElement;
    }

    public void dispose() {
    }

    public void inputChanged(final Viewer viewer, final Object oldInput, final Object newInput) {

    }
  }

  private class MyLabelProvider extends CellLabelProvider implements ITableLabelProvider {

    @Override
    public Image getColumnImage(final Object element, final int columnIndex) {
      return null;
    }

    @Override
    public String getColumnText(final Object element, final int columnIndex) {
      return element.toString();
    }

    @Override
    public void update(final ViewerCell cell) {
      // TODO - set alignment based on the cell text?
    }

  }

  public class MyModel {
    public int counter;

    public MyModel(final int counter) {
      this.counter = counter;
    }

    @Override
    public String toString() {
      return "Item " + this.counter;
    }
  }

  public TableViewerAlignmentSnippet(final Composite comp) {
    final TableViewer v = new TableViewer(new Table(comp, SWT.BORDER));
    v.setLabelProvider(new MyLabelProvider());
    v.setContentProvider(new MyContentProvider());
    v.getTable().setHeaderVisible(true);

    TableColumnLayout ad = new TableColumnLayout();
    comp.setLayout(ad);

    TableColumn column = new TableColumn(v.getTable(), SWT.NONE);
    column.setText("Column 1");
    column.setMoveable(true);
    ad.setColumnData(column, new ColumnWeightData(90, 290));

    column = new TableColumn(v.getTable(), SWT.NONE);
    column.setText("Column 2");
    column.setMoveable(true);
    ad.setColumnData(column, new ColumnWeightData(10, 200));

    MyModel[] model = createModel();
    v.setInput(model);
    v.getTable().setLinesVisible(true);
  }

  private MyModel[] createModel() {
    MyModel[] elements = new MyModel[10];

    for (int i = 0; i < 10; i++) {
      elements[i] = new MyModel(i);
    }

    return elements;
  }

  public static void main(final String[] args) {
    Display display = new Display();
    Shell shell = new Shell(display);
    shell.setLayout(new FillLayout());

    new TableViewerAlignmentSnippet(shell);
    shell.open();

    while (!shell.isDisposed()) {
      if (!display.readAndDispatch()) {
        display.sleep();
      }
    }

    display.dispose();

  }

}
4

1 に答える 1

0

OwnerDrawLabelProviderセルごとに配置を設定したい列のセルをペイントするには、セルを参照する必要があると思います。

于 2013-01-30T05:30:52.570 に答える