Form控件的使用

By | 4月 1, 2018

完整代码:https://github.com/tadckle/rcp/blob/master/rcp3/rcp3.study/src/rcp3/study/composite/LoginComposite.java

我们有一个登陆页面,使用Form对它进行装饰。

image

添加一个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());

image

给Form Head渲染颜色

FormToolkit的decorateFormHeading方法会给form的head渲染一个系统默认的渐变颜色。

toolkit.decorateFormHeading(loginForm);

image

在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);

image

给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);

image

显示Form Message

调用Form的setMessage方法,可以在Head中间显示消息,有个重载方法,第二个参数可以指定message类型(info, warning或error)。

普通message

只是显示message,title image没变化。例如登录时,显示天气信息。

loginForm.setMessage("There sporadic rain today.");

image

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);
}

image

给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();
    }
});

image

显示忙碌状态

title左上角的图标,变成一个忙碌的动态图标,根据系统而异。win10下显示的是旋转的点。true为busy,false还原成原来样式。

loginForm.setBusy(true);

image

添加Menu

和添加Toolbar一样,获得MenuManager后,往里面添加Action便可。有Menu时,title旁边有个小三角,点击可以打开弹出menu。

IMenuManager menuManager = loginForm.getMenuManager();
menuManager.add(addAction);
menuManager.add(likeAction);

menuManager.update(true);

image

给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。

image