我们有一个登陆页面,使用Form对它进行装饰。
添加一个title和image
image就像一个小icon在左上角。setSeparatorVisible(true)会显示分隔线,false时不显示。
Form loginForm = toolkit.createForm(parent); loginForm.setText("Login System"); loginForm.setImage(LOGIN_IMG); loginForm.setSeparatorVisible(true); createLoginComp(loginForm.getBody());
给Form Head渲染颜色
FormToolkit的decorateFormHeading方法会给form的head渲染一个系统默认的渐变颜色。
toolkit.decorateFormHeading(loginForm);
在Head下一行添加自定义控件
调用Form的setHeadClient方法可以在head下一行添加任何控件。为了让新添加的控件具有和Form Head一样的背景色,不能使用FormToolkit生成控件,FromToolkit会给它创建的控件设置新的颜色,默认是白色。这里我只在Head下面加一个Label。
Composite headClient = new Composite(loginForm.getHead(), SWT.NONE); GridLayoutFactory.swtDefaults().applyTo(headClient); Label headClientLbl = new Label(headClient, SWT.NONE); headClientLbl.setText("A great ship asks for deep waters."); GridDataFactory.swtDefaults().applyTo(headClientLbl); loginForm.setHeadClient(headClient);
给Form添加Toolbar
Form的ToolBar是显示在Head的最右边。
IToolBarManager toolBarManager = loginForm.getToolBarManager(); Action addAction = new Action() { @Override public void run() { // TODO: Add something super.run(); } }; addAction.setImageDescriptor( ImageDescriptor.createFromURL(FormUsage.class.getResource("add.png"))); addAction.setToolTipText("Add something"); toolBarManager.add(addAction); Action likeAction = new Action() { @Override public void run() { // TODO: Add to favorite super.run(); } }; likeAction.setImageDescriptor( ImageDescriptor.createFromURL(FormUsage.class.getResource("heart.png"))); likeAction.setToolTipText("Add to favorite"); toolBarManager.add(likeAction); toolBarManager.update(true);
显示Form Message
调用Form的setMessage方法,可以在Head中间显示消息,有个重载方法,第二个参数可以指定message类型(info, warning或error)。
普通message
只是显示message,title image没变化。例如登录时,显示天气信息。
loginForm.setMessage("There sporadic rain today.");
Information, Warnging,Error Message
通过第二个参数,指定是Message类型。使用IMessageProvider提供的三个常量,INFORMATION, WARNING和EEEOR。Title的icon也会变成SWT提供的info icon, warning icon和error icon。将message设置为null或empty可以恢复Title image为原样。
if (!"alex".equals(idTxt.getText()) || !"alex".equals(pwdTxt.getText())) { //loginForm.setMessage("This information message", IMessageProvider.INFORMATION); //loginForm.setMessage("This warning message", IMessageProvider.INFORMATION); loginForm.setMessage("User id or password are incorrect.", IMessageProvider.ERROR); } else { loginForm.setMessage(null); }
给Message添加Link事件
Form有个addMessageHyperlinkListener(IHyperlinkListener)方法,如果添加了HyperlinkListner后,Form的INFORMATION, WARNING, ERROR将会变成一个超链接,点击可执行我们添加的事件。普通Message不会变成超链接。
下面的例子,点击消息链接,弹出一个窗口。
loginForm.addMessageHyperlinkListener(new HyperlinkAdapter() { @Override public void linkActivated(HyperlinkEvent e) { MessageBox msgBox = new MessageBox(shell, SWT.ICON_INFORMATION); msgBox.setText("Login failed"); msgBox.setMessage("If you forgot your password. " + "Please consult our INFO DESK to restore your password."); msgBox.open(); } });
显示忙碌状态
title左上角的图标,变成一个忙碌的动态图标,根据系统而异。win10下显示的是旋转的点。true为busy,false还原成原来样式。
loginForm.setBusy(true);
添加Menu
和添加Toolbar一样,获得MenuManager后,往里面添加Action便可。有Menu时,title旁边有个小三角,点击可以打开弹出menu。
IMenuManager menuManager = loginForm.getMenuManager(); menuManager.add(addAction); menuManager.add(likeAction); menuManager.update(true);
给Form添加拖拽行为
调用Form的addTitleDragSupport方法便可。
loginForm.addTitleDragSupport(DND.DROP_MOVE, new Transfer[] {TextTransfer.getInstance()}, new DragSourceAdapter() { @Override public void dragSetData(DragSourceEvent event) { event.data = "Drag data"; } });
将拖拽的接收控件,设置为User ID输入框。
DropTarget dropTarget = new DropTarget(idTxt, DND.DROP_MOVE); dropTarget.setTransfer(new Transfer[] {TextTransfer.getInstance()}); dropTarget.addDropListener(new DropTargetAdapter() { public void drop(DropTargetEvent event) { idTxt.setText((String) event.data); } });
此时点击Form的title就可以拖拽了,移动到ID输入框松开,ID输入框设置为Drag data。