前段时间项目中有个需求要修改RCP程序中状态栏文字的样式,一直无法获得状态栏中的label,而直接使用StatusLine来new Label显示不出来,翻遍源码找到一种折中处理方式,记下来,不知是否还有其他更好的办法。
RCP程序如果要给状态栏设置信息,一般得做法是在ApplicationActionBarAdvisor中重写父类的方法fillStatusLine,写法有2种:(至于怎么显示状态栏这里就不介绍,google一下网上很多)
第一种:直接设置文本,这种情况下,文本是靠左对齐,但是无法修改文本的样式
第二种:添加statusItem,这种情况设置样式比较简单,但是无法左对齐,文字老是和左边有一大块的距离
我这里改变状态栏样式的方法如下:
需要注意的是:如果你在ApplicationActionBarAdvisor中重写父类的方法fillStatusLine中设置文本:statusLineManager.setMessage("设置状态栏文字");然后再改变样式是不成功的,因为现在状态栏还没有创建好,使用StatusLineManager的getControl()方法来获得状态栏所得到的是null,因此此处设置样式是无效的
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$
}
@Override
public 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,因此此处设置样式是无效的