RCP开发中: 在【状态栏】显示 用户登录信息
任务目标:实现如图所示的状态栏
(1)对ApplicationWorkbenchWindowAdvisor.java中的preWindow() 方法做如下修改:
public void preWindowOpen() {
??????? IWorkbenchWindowConfigurer configurer = getWindowConfigurer();
??????? configurer.setInitialSize(new Point(900, 650));
??????? configurer.setShowCoolBar(true);
??????? configurer.setShowStatusLine(true); //状态栏可见
??????? configurer.setShowProgressIndicator(true);
??????? configurer.setShowFastViewBars(true);
??????? configurer.setTitle("Hello RCP");//$NON-NLS-1$
??? }
(2)对ApplicationActionBarAdvisor.java类进行修改:
在ApplicationActionBarAdvisor.java中:
1》。声明一个ContributionItemForLogout 类型(接下来会说明)的变量 private ContributionItemForLogout logoutItem;
2》。在makeAction()方法中对变量进行实例化:logoutItem=new ContributionItemForLogout("LogoutItem002");????
3》。加入重写父类的fillStatusLine()方法:
@Override
?protected void fillStatusLine(IStatusLineManager statusLine) {
??super.fillStatusLine(statusLine);
??//用户登录状态,这里只是简单地用一个boolean变量模仿了一下
??boolean flog=false;
??if(flog==false){//没登陆的情况下(也就是上图所显示的情况)
???logoutItem.setVisible(true);
???statusLine.add(logoutItem);
??/*}else{
???loginItem.setVisible(true);
???statusLine.add(loginItem);*/
??}
?}?
(3)在步骤二中的ContributionItemForLogout是自己 extends StatusLineContributionItem的一个类。这个是关键,也就是该类实现了在状态栏的显示功能:
public class ContributionItemForLogout extends StatusLineContributionItem {
?public ContributionItemForLogout(String id) {
??super(id);
?}
?@Override
//这是该类的主题部分,状态栏的显示也就是在该方法中完成,其参数final类型是为了方便内部类的调用而修改的
?public void fill(final Composite parent)??{
?? Label sep = new Label(parent, SWT.SEPARATOR);???????//设置状态栏分隔线
??? final Label label=new Label(parent,SWT.NONE);?????????? //要 加载菜单 及 显示图像 的标签项
??
??? //给各个Label变量分别设置layoutData????
??? StatusLineLayoutData layoutDataSep=new StatusLineLayoutData();
??? sep.setLayoutData(layoutDataSep);???????????????????????????????????????????????????
??? StatusLineLayoutData layoutDataLabel=new StatusLineLayoutData();
??? layoutDataLabel.widthHint=20;???//设置其宽度
??? label.setLayoutData(layoutDataLabel);
???
??? CLabel clabel=new CLabel(parent,SWT.NONE);//CLabel作为显示文本的标签,能够居中显示,你可以试试Label就知道不同了。
??? clabel.setText("have not login");
??? Display dy=Display.getCurrent();??????
??? //设置图标,这里是绝对路径,图标可以自己选,其实,可以把路径放到一个文件里统一管理,这里就先这样写。?????
??? Image img=new Image(dy,"D:/Documents/workspace/org.xxx.xxx.xxx/icons/offline.ico");????
??? label.setImage(img);
??? label.setToolTipText("have not login");
????
??? //添加鼠标监听
??? label.addMouseListener(new MouseAdapter(){
?????@Override
?????public void mouseUp(MouseEvent e) {//添加 菜单项
?????? Menu menu=new Menu(parent);???
?????? MenuItem item=new MenuItem(menu,SWT.ARROW_UP);? ?//菜单项1
?????? MenuItem item2=new MenuItem(menu,SWT.BAR);???????? ??? ?//菜单项2(分割条)
?????? MenuItem item3=new MenuItem(menu,SWT.ARROW_UP); //菜单项3
?????? item.setText("To Login");
?????? item2.setText("bar");
?????? item3.setText("To Register");
?????? label.setMenu(menu);???//设置其菜单项
?????? menu.setVisible(true);???//设置菜单项可见(别忘了)
???? }????
??? }) ;
??//添加相关的鼠标监听,可选???
??label.addMouseTrackListener(new MouseTrackListener(){
??@Override
??public void mouseEnter(MouseEvent e) {
???//label.setBackground(new Color(Display.getDefault(),0,0,255));??
???
???//label.setAlignment(12);
???//label.setCapture(true);
???label.setCursor(new Cursor(Display.getCurrent(),21));
??}
??
??@Override
??public void mouseExit(MouseEvent e) {
???//label.setBackground(new Color(Display.getDefault(),255,255,255));
??}
?????
??@Override
??public void mouseHover(MouseEvent e) {
???//label.setBackground(new Color(Display.getDefault(),0,255,255));???
??}????
??? });
???
??? label.setEnabled(true);???//label可用
??? label.setVisible(true);? ???//?label可见(别忘了)??
?
?}?
}
PS:这就基本完成了,不过在 状态栏 实现下拉菜单 还是没能实现,接下来时间再看看。?
??????? 由于刚接触RCP的东西,网上的资料也不是太多,就这么一个小功能花了我很长时间,不过万事开头难,我想慢慢会好的。
?????? 这是个小结,希望对做RCP开发的朋友有用。
?
?
?