JFace TableViewer - Setting font color for all Cel

2019-08-03 21:20发布

问题:

I have asked a very similar question, but I ended up using images instead of changing the color.

I want all the text in the cells to be dark grey. I understand that you have to assign each column. But I do not how to do it.

This is one of my columns in my TableViewer.

col = new TableViewerColumn(this , SWT.NONE);
col.getColumn().setWidth(200);
col.getColumn().setText("Printer/Profile");
col.setLabelProvider(new ColumnLabelProvider() {
    @Override
    public String getText(Object element) {
        AplotResultsDataModel.ResultsData p = (AplotResultsDataModel.ResultsData) element;
        return p.getPrinterProfile();
    }
}); 

How would I change the above code to incorporate setting the font color to dark gray?

EDIT

If I am using the switch, how does it know how many columns I have? also how do I set the column names? Here is how I have it set up right now

TableViewerColumn col = new TableViewerColumn(this , SWT.NONE);
  col.getColumn().setWidth(150);
  col.getColumn().setText("ItemId");
  col.setLabelProvider(new ColumnLabelProvider() {
     @Override
     public void update(ViewerCell cell)
     {
         Object element = cell.getElement();
         if(element instanceof AplotPDFDataModel.FileNameData)
         {
            AplotPDFDataModel.FileNameData p = (AplotPDFDataModel.FileNameData) element;
            cell.setForeground(ColorConstants.darkGray);
            switch(cell.getColumnIndex())
            {
               case 0:
                  try {
                     cell.setText(p.getRev().getStringProperty("item_id"));
                  }
                  catch (TCException e) {
                     e.printStackTrace();
                  }
                  break;
               case 1:
                  try {
                     cell.setText(p.getRev().getStringProperty("item_revision_id"));
                  }
                  catch (TCException e) {
                     e.printStackTrace();
                  }
                  break;
               case 2:
                  cell.setText(p.getPRLValue().toString());
                  break;
               case 3:
                  cell.setText(p.getMarkupValue());
                  break;
               case 4:
                  cell.setText(p.getFileName());
                  break;
             }
         }
     }
 });

回答1:

I would use the method update(ViewerCell cell) of the ColumnLabelProvider instead of getText(). Then you can call ViewerCell#setForeground(Color color):

public class ColorColumnLabelProvider extends ColumnLabelProvider {
    @Override
    public void update(ViewerCell cell)
    {
        Object element = cell.getElement();
        if(element instanceof AplotResultsDataModel.ResultsData)
        {
            AplotResultsDataModel.ResultsData p = (AplotResultsDataModel.ResultsData) element;

            cell.setForeground(YOUR_COLOR);
            switch(cell.getColumnIndex())
            {
                case 0:
                    cell.setText(p.YOUR_FIRST_TEXT);
                    break;
                case 1:
                    cell.setText(p.YOUR_SECOND_TEXT);
                    break;
                case ...
            }
        }
    }
}

Then use:

col.getColumn().setWidth(150);
col.getColumn().setText("ItemId");
col.setLabelProvider(new ColorColumnLabelProvider());

Since I switch the column index, you can use this ColorColumnLabelProvider for all your columns.

Don't forget to dispose the color somewhere.

If you use ColorConstants of Draw2d, you don't need to dispose them.

In your case ColorConstants.darkGray would do the job.

ALTERNATIVE:

You can also define a ColumnLabelProvider that implements IColorProvider:

public class ColorColumnLabelProvider extends ColumnLabelProvider implements IColorProvider {

    @Override
    public Color getBackground(Object element) {
        return null;
    }

    @Override
    public Color getForeground(Object element) {
        return YOUR_COLOR;
    }

    @Override
    public String getText(Object element) {
        AplotResultsDataModel.ResultsData p = (AplotResultsDataModel.ResultsData) element;
        return p.getPrinterProfile();
    }

}