RCP 修改ApplicationWindow的StatusLineManager中文本样式
前段时间项目中有个需求要修改RCP程序中状态栏文字的样式,一直无法获得状态栏中的label,而直接使用StatusLine来new Label显示不出来,翻遍源码找到一种折中处理方式,记下来,不知是否还有其他更好的办法。
RCP程序如果要给状态栏设置信息,一般得做法是在ApplicationActionBarAdvisor中重写父类的方法fillStatusLine,写法有2种:(至于怎么显示状态栏这里就不介绍,google一下网上很多)
第一种:直接设置文本,这种情况下,文本是靠左对齐,但是无法修改文本的样式
@Override protected void fillStatusLine(IStatusLineManager statusLine){ statusLine.setMessage("");}第二种:添加statusItem,这种情况设置样式比较简单,但是无法左对齐,文字老是和左边有一大块的距离
@Override protected void fillStatusLine(IStatusLineManager statusLine){ super.fillStatusLine(statusLine); final StatusLineContributionItem statusItem = new StatusLineContributionItem(""); statusItem.setText(message); statusLine.add(statusItem); }我这里改变状态栏样式的方法如下:
package rcp;import org.eclipse.jface.action.IStatusLineManager;import org.eclipse.jface.action.StatusLineManager;import org.eclipse.swt.custom.CLabel;import org.eclipse.swt.graphics.Point;import org.eclipse.swt.widgets.Composite;import org.eclipse.swt.widgets.Control;import org.eclipse.ui.application.ActionBarAdvisor;import org.eclipse.ui.application.IActionBarConfigurer;import org.eclipse.ui.application.IWorkbenchWindowConfigurer;import org.eclipse.ui.application.WorkbenchWindowAdvisor;public class ApplicationWorkbenchWindowAdvisor extends WorkbenchWindowAdvisor {private IStatusLineManager statusLineManager; public ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer) { super(configurer); } public ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer) { statusLineManager = configurer.getStatusLineManager(); return new ApplicationActionBarAdvisor(configurer); } public void preWindowOpen() { IWorkbenchWindowConfigurer configurer = getWindowConfigurer(); configurer.setInitialSize(new Point(400, 300)); configurer.setShowCoolBar(true); configurer.setShowStatusLine(true); configurer.setTitle("Hello RCP"); //$NON-NLS-1$ }@Overridepublic void postWindowCreate() {super.postWindowCreate();//经过测试发现,在此处,状态栏创建完毕,我在此设置文本statusLineManager.setMessage("设置状态栏文字");/** * 注意此处:一定要在setMessage方法后调用,因为statusLineManager.setMessage("")时会自己设置一个颜色, * 如果在statusLineManager.setMessage("")之前调用,那么颜色会被覆盖,没有发生改变 */setStatusStyle((StatusLineManager)statusLineManager);} private void setStatusStyle(StatusLineManager statusLineManager){ Composite composite = (Composite) statusLineManager.getControl(); //获得状态栏下的所有控件 Control[] controls = composite.getChildren(); for(Control control : controls){ if(control instanceof CLabel){ CLabel cLabel = (CLabel)control; //设置字体和颜色 cLabel.setFont(null); cLabel.setForeground(null); break; } } } }需要注意的是:如果你在ApplicationActionBarAdvisor中重写父类的方法fillStatusLine中设置文本:statusLineManager.setMessage("设置状态栏文字");然后再改变样式是不成功的,因为现在状态栏还没有创建好,使用StatusLineManager的getControl()方法来获得状态栏所得到的是null,因此此处设置样式是无效的