2013-11-24 41 views
4

我當前想寫一個基於JFace的Eclipse編輯器TreeViewer。我向TreeViewer添加了CellLabelProvider。如果將直接在CellLabelProviderupdate方法中的單元格的字體設置爲粗體字體,則標籤顯示爲粗體。如何使TreeViewer單元的一部分變爲粗體?

但我只想將部分標籤顯示爲粗體。所以我將StyleRanges應用於細胞。 'StyleRange'的作品中的所選顏色完美無缺,但將StyleRange的字體設置爲粗體,看起來不起作用。

這是爲什麼,如何解決?

回答

2

您可能需要使用基於StyledCellLabelProvider的標籤提供程序。

DelegatingStyledCellLabelProvider最容易使用,因爲您只需提供一個實施DelegatingStyledCellLabelProvider.IStyledLabelProvider的標籤供應商。其中的關鍵方法是

public StyledString getStyledText(Object element); 

它讓你只需爲每個對象返回一個StyledString

+0

嘿格雷格,你能更具體?我遇到了同樣的問題,以粗體顯示TreeViewer的節點http://stackoverflow.com/q/22679468/1299675?sem=2 –

5

正如greg-449規定,基本上你可以創建你的Font,並設置爲大膽

class BoldFontStyler extends Styler {                 
    @Override 
    public void applyStyles(final TextStyle textStyle) 
    { 
     FontDescriptor boldDescriptor = FontDescriptor.createFrom(new FontData()).setStyle(SWT.BOLD); 
     Font boldFont = boldDescriptor.createFont(Display.getCurrent()); 
     textStyle.font = boldFont; 
    } 
} 

然後你可以應用到你的StyledString#getStyledText()

我不確定這是否便攜,我只是在我的Linux機器上測試過。

完整的例子(只是將其連接到Part):

package com.ebotlution.c4ids.comms.ui; 

import javax.annotation.PostConstruct; 

import org.eclipse.jface.resource.FontDescriptor; 
import org.eclipse.jface.viewers.ColumnLabelProvider; 
import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider; 
import org.eclipse.jface.viewers.ILabelProviderListener; 
import org.eclipse.jface.viewers.ITreeContentProvider; 
import org.eclipse.jface.viewers.StyledString; 
import org.eclipse.jface.viewers.StyledString.Styler; 
import org.eclipse.jface.viewers.TreeViewer; 
import org.eclipse.jface.viewers.TreeViewerColumn; 
import org.eclipse.jface.viewers.Viewer; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.graphics.Font; 
import org.eclipse.swt.graphics.FontData; 
import org.eclipse.swt.graphics.Image; 
import org.eclipse.swt.graphics.TextStyle; 
import org.eclipse.swt.widgets.Composite; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.TreeColumn; 

class BoldFontStyler extends Styler { 
    @Override 
    public void applyStyles(final TextStyle textStyle) 
    { 
     FontDescriptor boldDescriptor = FontDescriptor.createFrom(new FontData()).setStyle(SWT.BOLD); 
     Font boldFont = boldDescriptor.createFont(Display.getCurrent()); 
     textStyle.font = boldFont; 
    } 
} 

class NormalColumnLabelProvider extends ColumnLabelProvider { 
    @Override 
    public String getText(Object element) { 
     return (element).toString().split(" ")[0]; 
    } 
} 

class BoldColumnLabelProvider extends DelegatingStyledCellLabelProvider { 
    static final Styler BOLD_FONT_STYLER = new BoldFontStyler(); 

    public BoldColumnLabelProvider() { 
     super(new IStyledLabelProvider() { 
      @Override 
      public Image getImage(Object element) { 
       return null; 
      } 

      @Override 
      public StyledString getStyledText(Object element) { 
       return new StyledString((element).toString().split(" ")[1], BOLD_FONT_STYLER); 
      } 

      @Override 
      public void addListener(ILabelProviderListener listener) {} 

      @Override 
      public void dispose() {} 

      @Override 
      public boolean isLabelProperty(Object element, String property) { 
       return false; 
      } 

      @Override 
      public void removeListener(ILabelProviderListener listener) {} 
     }); 
    } 
} 

class MyContentProvider implements ITreeContentProvider { 

    static final Object[] EMPTY_ARRAY = new Object[0]; 

    Object[] data; 

    @Override 
    public void dispose() {} 

    @Override 
    public void inputChanged(Viewer viewer, Object oldInput, Object newInput) { 
     data = (Object[]) newInput; 
    } 

    @Override 
    public Object[] getElements(Object inputElement) { 
     return data; 
    } 

    @Override 
    public Object[] getChildren(Object parentElement) { 
     return EMPTY_ARRAY; 
    } 

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

    @Override 
    public boolean hasChildren(Object element) { 
     return false; 
    } 
} 

public class BoldColumnTreeViewerEx { 

    TreeViewer treeViewer; 

    @PostConstruct 
    public void createControls(Composite parent) { 
     treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL); 
     treeViewer.setUseHashlookup(true); 
     treeViewer.setContentProvider(new MyContentProvider()); 
     // Do all your stuff 
     // [...] 

     TreeViewerColumn normalCol = createTreeViewerColumn("Normal Column"); 
     normalCol.setLabelProvider(new NormalColumnLabelProvider()); 

     TreeViewerColumn boldCol = createTreeViewerColumn("Bold Column"); 
     boldCol.setLabelProvider(new BoldColumnLabelProvider()); 

     treeViewer.setInput(new String[] { "Hello Dude", "SWT JFace" }); 
     treeViewer.expandAll(); 
    } 

    private TreeViewerColumn createTreeViewerColumn(String title) { 
     TreeViewerColumn viewerColumn = new TreeViewerColumn(treeViewer, SWT.NONE); 
     TreeColumn column = viewerColumn.getColumn(); 
     column.setText(title); 
     column.setWidth(100); 
     return viewerColumn; 
    } 
} 

example-screenshor

+0

這個答案正常工作,並提供了一個很好的解決方案。考慮遵循這個想法。 –

相關問題