Java 如何在每个单元格的基础上右对齐SWT表格单元格中的文本

Java 如何在每个单元格的基础上右对齐SWT表格单元格中的文本,java,swt,jface,Java,Swt,Jface,我有一个由JFace TableViewer包装的SWT表。我知道如何右对齐整列: TableColumn column = new TableColumn(viewer.getTable(), SWT.RIGHT); 然而,我想做的是根据输入改变每个单元格的对齐方式-基本上我只想右对齐包含数字的单元格 我一直在用一个片段(摘自)来尝试这一点。此表使用CellLabelProvider。我想我可以在更新(ViewerCell单元格)方法中更改对齐方式,因为该方法允许您设置每个单元格的背景色。然

我有一个由JFace TableViewer包装的SWT表。我知道如何右对齐整列:

TableColumn column = new TableColumn(viewer.getTable(), SWT.RIGHT);
然而,我想做的是根据输入改变每个单元格的对齐方式-基本上我只想右对齐包含数字的单元格

我一直在用一个片段(摘自)来尝试这一点。此表使用CellLabelProvider。我想我可以在
更新(ViewerCell单元格)
方法中更改对齐方式,因为该方法允许您设置每个单元格的背景色。然而,我找不到合适的刺激物

有什么建议吗?下面是完整的片段

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();

  }

}
import org.eclipse.jface.layout.TableColumnLayout;
导入org.eclipse.jface.viewers.CellLabelProvider;
导入org.eclipse.jface.viewers.ColumnWeightData;
导入org.eclipse.jface.viewers.IStructuredContentProvider;
导入org.eclipse.jface.viewers.ITableLabelProvider;
导入org.eclipse.jface.viewers.TableViewer;
导入org.eclipse.jface.viewers.Viewer;
导入org.eclipse.jface.viewers.ViewerCell;
导入org.eclipse.swt.swt;
导入org.eclipse.swt.graphics.Image;
导入org.eclipse.swt.layout.FillLayout;
导入org.eclipse.swt.widgets.Composite;
导入org.eclipse.swt.widgets.Display;
导入org.eclipse.swt.widgets.Shell;
导入org.eclipse.swt.widgets.Table;
导入org.eclipse.swt.widgets.TableColumn;
/**
*用于在表查看器中对齐的代码段。
*/
公共类TableViewerAlignmentSnippet{
私有类MyContentProvider实现IStructuredContentProvider{
公共对象[]getElements(最终对象inputElement){
返回(MyModel[])inputElement;
}
公共空间处置(){
}
公共无效输入已更改(最终查看器、最终对象oldInput、最终对象newInput){
}
}
私有类MyLabelProvider扩展CellLabelProvider实现ITableLabelProvider{
@凌驾
公共映像getColumnImage(最终对象元素,最终int columnIndex){
返回null;
}
@凌驾
公共字符串getColumnText(最终对象元素,最终int columnIndex){
返回元素.toString();
}
@凌驾
公共无效更新(最终视口单元格){
//TODO-基于单元格文本设置对齐方式?
}
}
公共类MyModel{
公共int计数器;
公共MyModel(最终整数计数器){
this.counter=计数器;
}
@凌驾
公共字符串toString(){
返回“项目”+此计数器;
}
}
public TableViewerAlignmentSnippet(最终合成合成){
最终的TableViewer v=新的TableViewer(新表(组件、SWT.BORDER));
v、 setLabelProvider(新的MyLabelProvider());
v、 setContentProvider(新的MyContentProvider());
v、 getTable().setheadervible(true);
TableColumnLayout ad=新的TableColumnLayout();
组件设置布局(ad);
TableColumn=newtableColumn(v.getTable(),SWT.NONE);
第1列(“第1列”);
column.setMoveable(true);
ad.setColumnData(列,新列权重数据(90290));
column=newtablecolumn(v.getTable(),SWT.NONE);
第2栏(“第2栏”);
column.setMoveable(true);
ad.setColumnData(列,新列权重数据(10200));
MyModel[]model=createModel();
v、 设置输入(模型);
v、 getTable().setLinesVisible(true);
}
私有MyModel[]createModel(){
MyModel[]元素=新的MyModel[10];
对于(int i=0;i<10;i++){
元素[i]=新的MyModel(i);
}
返回元素;
}
公共静态void main(最终字符串[]args){
显示=新显示();
外壳=新外壳(显示);
setLayout(新的FillLayout());
新的TableViewerAlignmentSnippet(shell);
shell.open();
而(!shell.isDisposed()){
如果(!display.readAndDispatch()){
display.sleep();
}
}
display.dispose();
}
}

我认为您应该查看
OwnerDrawLabelProvider
为要设置每个单元格对齐方式的列绘制单元格