高级SmartGWT教程,第2部分

这是我的教程的第二部分,有关使用SmartGWT快速进行UI开发。 在本教程的第一部分中 ,我们创建了基本的界面布局并添加了一些基本组件。 现在是时候解决这个问题,并使用SmartGWT的真正功能了。

在继续之前,让我们记住到目前为止我们创建的UI的样子:

完成本教程后,UI将会变成以下内容:

为了重新定义它们的功能,我们将不得不重新访问一些现有的类。 让我们从NavigationArea类开始。 在那里,我们使用SectionStack类创建了手风琴。 但是,每个堆栈部分仅包含一个普通标签。 我们将在导航方面添加一些更有用的东西。 我们将在导航窗格中使用一棵树,其中每个叶子实际上将代表一个动作。 为此,我们将通过定义out实现的特定特征来扩展TreeGrid类。 因此,这是“ NavigationTreeGrid”类:

package com.javacodegeeks.smartgwt.appui.client.ui.widgets;import com.smartgwt.client.types.SelectionStyle;
import com.smartgwt.client.types.TreeModelType;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.tree.Tree;
import com.smartgwt.client.widgets.tree.TreeGrid;
import com.smartgwt.client.widgets.tree.TreeNode;
import com.smartgwt.client.widgets.tree.events.NodeClickEvent;
import com.smartgwt.client.widgets.tree.events.NodeClickHandler;public class NavigationTreeGrid extends TreeGrid {public NavigationTreeGrid() {setNodeIcon("arrow_down.png");  setFolderIcon("arrow_up.png");  setShowOpenIcons(false);setShowDropIcons(false);setShowSelectedStyle(true);  setShowPartialSelection(true);  setCascadeSelection(false);setCanSort(false);setShowConnectors(true);setShowHeader(false);setLoadDataOnDemand(false);setSelectionType(SelectionStyle.SINGLE);Tree data = new Tree();data.setModelType(TreeModelType.CHILDREN);data.setRoot(new TreeNode("root", new TreeNode("File",new TreeNode("FileChild")), new TreeNode("Edit",new TreeNode("EditChild",new TreeNode("EditGrandChild"))), new TreeNode("Window")));setData(data);addNodeClickHandler(new NodeClickHandler() {            @Overridepublic void onNodeClick(NodeClickEvent event) {String name = event.getNode().getName();SC.say("Node Clicked: " + name);}});}}

我们首先为树定义一些属性,更重要的是:

  • setShowConnectors :定义是否应显示连接器线,以说明树的层次结构。
  • setClosedIconSuffix :此后缀附加在提供的图标名称后,默认为“ closed”,因此您最好使用自定义值并覆盖该值。
  • setSelectionType :定义网格的可单击选择行为,即,是否可以在给定时间选择多个项目。

此外, setNodeIcon和setFolderIcon方法用于为每个节点设置适当的图标,具体取决于它是父节点还是叶节点。

接下来,我们创建一个Tree实例,该实例本质上是一个数据模型,它代表链接到层次结构中的一组对象。 每个树节点都是通过TreeNode类实现的,我们使用setRoot方法设置根节点。 请注意,可以通过使用名称和对象数组来构造每个节点,因此,通过采用递归方法,我们可以在一行中创建整个树。 然后,我们使用setData方法将Tree中的数据提供给TreeGrid 。 最后,我们为节点单击事件注册一个处理程序,并通过创建一个显示节点名称的弹出窗口来实现NodeClickHandler接口。

为了使用我们新创建的树,我们返回“ NavigationArea”类并更改以下几行:

...
SectionStackSection section1 = new SectionStackSection("Section 1");
section1.setExpanded(true);
final NavigationTreeGrid navigationTreeGrid = new NavigationTreeGrid();
navigationTreeGrid.setHeight100();
section1.addItem(navigationTreeGrid);
...

让我们看看这是如何改变导航区域中的界面的:

单击其中一个节点后,将出现一个具有相关名称的窗口:

下一步是填充现在几乎是空的主要区域。 我们将为此使用标签。 使用选项卡是高度首选的,因为它在屏幕空间方面非常有效。 通过堆叠选项卡,用户可以同时打开许多面板,只需单击即可导航到首选面板。

在SmartGWT中,选项卡的使用由Tab类提供。 但是,为了呈现选项卡,必须将这些选项卡分组在TabSet中 ,该选项卡允许多个窗格上的组件共享同一空间。 用户可以选择顶部的选项卡以显示每个窗格。

现在,我们将重新访问“ MainArea”类,并在其中添加三个不同的选项卡窗格。 第一个将仅包含任意HTML元素,第二个将具有连接的菜单,第三个将包含自定义垂直手风琴。 让我们看看如何做到这一点:

package com.javacodegeeks.smartgwt.appui.client.ui;import com.javacodegeeks.smartgwt.appui.client.ui.widgets.CustomAccordion;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.Side;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.menu.Menu;
import com.smartgwt.client.widgets.menu.MenuItem;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.toolbar.ToolStrip;
import com.smartgwt.client.widgets.toolbar.ToolStripButton;
import com.smartgwt.client.widgets.toolbar.ToolStripMenuButton;public class MainArea extends VLayout {final TabSet topTabSet = new TabSet();public MainArea() {super();this.setOverflow(Overflow.HIDDEN);topTabSet.setTabBarPosition(Side.TOP);  topTabSet.setTabBarAlign(Side.LEFT);ToolStrip toolStrip = new ToolStrip();toolStrip.setWidth100();ToolStripButton iconButton = new ToolStripButton();iconButton.setTitle("MyButton");toolStrip.addButton(iconButton);        MenuItem[] itemArray = new MenuItem[4];itemArray[0] = new MenuItem("MenuItem1");Menu menu1 = new Menu();menu1.setData(new MenuItem("SubMenuItem11"), new MenuItem("SubMenuItem12"));itemArray[0].setSubmenu(menu1);itemArray[1] = new MenuItem("MenuItem2");Menu menu2 = new Menu();menu2.setData(new MenuItem("SubMenuItem21"), new MenuItem("SubMenuItem22"));itemArray[1].setSubmenu(menu2);Menu parentMenu = new Menu();  parentMenu.setCanSelectParentItems(true);  parentMenu.setData(itemArray);ToolStripMenuButton menuButton = new ToolStripMenuButton("Menu", parentMenu);toolStrip.addMenuButton(menuButton);VLayout hlayout = new VLayout();hlayout.addMember(toolStrip);hlayout.addMember(new HTMLFlow("Tab3"));addTabToTopTabset("Tab1", new HTMLFlow("Tab1"), true);addTabToTopTabset("Tab2", hlayout, true);        addTabToTopTabset("Tab3", new CustomAccordion(), true);this.addMember(topTabSet);}private void addTabToTopTabset(String title, Canvas pane, boolean closable) {Tab tab = createTab(title, pane, closable);topTabSet.addTab(tab);topTabSet.selectTab(tab);}private Tab createTab(String title, Canvas pane, boolean closable) {Tab tab = new Tab(title);tab.setCanClose(closable);tab.setPane(pane);return tab;}}

这里要注意的事情。 首先,我们使用ToolStrip ,它实际上是可以附加各种小部件(按钮,菜单等)的条。 特定的类只能添加到工具条中。 例如,如果要添加按钮,则必须创建一个ToolStripButton实例。 同样,可以将整个菜单附加到该菜单上。 创建菜单类的实例后,我们使用MenuItem类向其添加组件。 最后,菜单被封装到ToolStripMenuButton中 ,然后最终被添加到工具条中。

关于标签,API非常简单。 我们使用TabSet类的addTab方法添加新的标签,并使用selectTab方法选择特定的标签。 在选项卡本身上,我们可以使用setPane方法来指定与特定选项卡关联的窗格。 要确定选项卡是否应提供用于关闭自身的图标,请使用setCanClose方法。

最后,让我们看一下“ CustomAccordion”类,它基本上是一种垂直手风琴。

package com.javacodegeeks.smartgwt.appui.client.ui.widgets;import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.types.VisibilityMode;
import com.smartgwt.client.widgets.HTMLFlow;
import com.smartgwt.client.widgets.layout.SectionStack;
import com.smartgwt.client.widgets.layout.SectionStackSection;public class CustomAccordion extends SectionStack {public CustomAccordion() {this.setWidth100();this.setVisibilityMode(VisibilityMode.MUTEX);this.setShowExpandControls(false);this.setAnimateSections(true);SectionStackSection section1 = new SectionStackSection("TabSection1"); section1.setExpanded(true); HTMLFlow htmlFlow1 = new HTMLFlow();  htmlFlow1.setOverflow(Overflow.AUTO);  htmlFlow1.setPadding(10);  htmlFlow1.setContents("TabSection1");     section1.addItem(htmlFlow1);SectionStackSection section2 = new SectionStackSection("TabSection2");  section2.setExpanded(false);  HTMLFlow htmlFlow2 = new HTMLFlow();  htmlFlow2.setOverflow(Overflow.AUTO);  htmlFlow2.setPadding(10);  htmlFlow2.setContents("TabSection2");  section2.addItem(htmlFlow2);SectionStackSection section3 = new SectionStackSection("TabSection3");  section3.setExpanded(false);HTMLFlow htmlFlow3 = new HTMLFlow();  htmlFlow3.setOverflow(Overflow.AUTO);  htmlFlow3.setPadding(10);  htmlFlow3.setContents("TabSection3");    section3.addItem(htmlFlow3);this.addSection(section1);  this.addSection(section2);  this.addSection(section3);}}

我们以前没见过什么,我们使用SectionStack类创建手风琴并向其添加SectionStackSection 。 HTMLFlow类用于显示应扩展到其自然大小而无需滚动HTML内容。

启动Eclipse配置,然后将浏览器指向提供的URL:

http://127.0.0.1:8888/AwesomeSmartGWTUIProject.html?gwt.codesvr=127.0.0.1:9997

现在让我们看一下每个选项卡的外观:

* Tab1:非常简单明了。

* Tab2:此选项卡包含一个工具条,上面带有一个按钮和一个菜单。

* Tab3:此选项卡将垂直手风琴围成三个独立的部分。

这就是整个用户界面的样子:

我们已经到了本教程的结尾,所以让我们重新回顾一下已经完成的工作。 首先,我们通过定义特定区域并添加相应的子布局来创建UI的主布局。 每个子布局都是单独处理的。 对于标题区域,我们在左侧添加了应用程序的徽标,在右侧添加了已登录用户的名称。 对于导航区域,我们使用了一个手风琴,该手风琴将一棵树封闭在其中的一部分中。 这棵树可以有任意数量的子代,孙代等,但是您不可以一味地接受它。 最后,对于主布局,我们使用了选项卡,以便最大程度地利用屏幕区域。 创建了三个预定义的选项卡,每个选项卡包含各种小部件。 请注意,导航窗格应链接到主区域。 每当用户单击其中一个叶子时,都可以通过创建一个新选项卡来实现。

伙计们。 您可以在这里找到创建的最终Eclipse项目。 如果您喜欢这个,别忘了分享! 干杯!

相关文章 :
  • 高级SmartGWT教程,第1部分
  • SmartGWT入门,提供出色的GWT界面
  • 将JSON功能添加到您的GWT应用程序中
  • 建立自己的GWT Spring Maven原型
  • 将CAPTCHA添加到您的GWT应用程序
  • GWT Spring和Hibernate进入数据网格世界

翻译自: https://www.javacodegeeks.com/2011/01/advanced-smartgwt-tutorial-part-2.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374731.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有感而发,生活

我们每一个人都是独一无二的,当然我们每一个人的路子也是不尽相同的,不能因为一时的失意而放弃了自己儿时的梦想,路是一步一步走的,未来需要努力,我相信 我们每一个人都可以做到自己心中的样子,安逸的生活是…

力扣反转字符串中的元音字母

给你一个字符串 s ,仅反转字符串中的所有元音字母,并返回结果字符串。 元音字母包括 ‘a’、‘e’、‘i’、‘o’、‘u’,且可能以大小写两种形式出现。 代码思路: 1.将字符串转换为字符数组 2.设置碰撞指针,从两头寻…

使用 SqlDataSource 插入、更新和删除数据49

简介 正如在 数据插入、更新和删除概述 中讨论的那样,GridView 控件提供内置的更新和删除功能,而DetailsView 和 FormView 控件则包含对插入、编辑和删除功能的支持。这些数据修改功能无需编写任何代码,可直接嵌入数据源控件。 数据插入、更新…

Solaris是出色的Java开发平台的原因

几天前,我发布了“ OpenSolaris的死亡:为Java开发人员选择操作系统 ”,其中我说Solaris是Java开发人员的绝佳平台。 这篇文章的重点只是想知道自OpenSolaris淘汰以来我将使用哪个Solaris版本。 正如Neil的评论使我意识到的那样,该…

python , angular js 学习记录【2】

1.不同scope之间的通信 (1)无父子关系的scope通信: 在需要操作的scope里面定义一个事件,名称为delete_host,参数为data $rootScope.$on(delete_host, function(event,data) {angular.forEach($scope.hosts, function (…

【转】phpize学习

为什么使用phpize? 比如刚开始安装的时候使用 ./configure --prefix/usr/local/php7 --exec-prefix/usr/local/php7 --bindir/usr/local/php7/bin --sbindir/usr/local/php7/sbin --includedir/usr/local/php7/include --libdir/usr/local/php7/lib/php --mandir/usr/local/ph…

GWT 2 Spring 3 JPA 2 Hibernate 3.5教程– Eclipse和Maven 2展示

不久前,我的一个朋友和同事向我飞过,说“世界上只有一半在使用Maven ”。 当我意识到最受欢迎的文章(到目前为止) GWT 2 Spring 3 JPA 2 Hibernate 3.5 Tutorial提出了一种基于Google的Web Toolkit( GWT ) …

Android的WiFi开启与关闭

注意&#xff1a;要首先注册开启和关闭WiFi的权限&#xff0c; <?xml version"1.0" encoding"utf-8"?> <manifest xmlns:android"http://schemas.android.com/apk/res/android"package"com.wyl.wifi"android:versionCode&q…

awk用法小结(作者总结)

http://www.chinaunix.net/old_jh/24/691456.htmlhttp://wenku.baidu.com/view/ebac4fc658f5f61fb736664d.htmlawk 用法&#xff1a;awk pattern {action} 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分…

力扣盛最多水的容器

给你 n 个非负整数 a1&#xff0c;a2&#xff0c;…&#xff0c;an&#xff0c;每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线&#xff0c;垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0) 。找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多…

Java最佳实践–多线程环境中的DateFormat

这是有关使用Java编程语言时的拟议实践的系列文章的第一篇。 所有讨论的主题均基于用例&#xff0c;这些用例来自于电信行业的关键任务超高性能生产系统的开发。 在阅读本文的每个部分之前&#xff0c;强烈建议您参考相关的Java API文档以获取详细信息和代码示例。 所有测试…

IntentDemo

Intent通信示例&#xff1a; 两个Button&#xff0c;一个startBrowser, 一个startPhone. 其中&#xff0c;OnClickListener()是类View的一个interface&#xff0c;需要实现其中的onClick()函数。 startActivity()开启另一个Activity&#xff0c;本示例中开启Browser或Phone. In…

JBoss 4.2.x Spring 3 JPA Hibernate教程

在花了许多时间在网上搜索之后&#xff0c;尝试找到对几个项目使用Spring&#xff0c;JPA和Hibenate的最有效方法&#xff0c;我们得出了将在下面介绍的配置的结论。 将Spring与JPA和Hibernate集成包括几个步骤&#xff1a; Spring容器的配置 JPA ORM层的配置 Hibernate Sec…

力扣长度最小的子数组

给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 方法一&#xff1a;移动窗口 设置两个指针&…

Yeelink:将复杂的传感器以极简的方式组到同一个网络内

Yeelink&#xff1a;将复杂的传感器以极简的方式组到同一个网络内转载于:https://www.cnblogs.com/qxql2016/p/4692629.html

androidstudio新建项目中在布局文件中不显示title的方法

在androidstudio新建项目的时候&#xff0c;在布局文件里有时候会出现如下情况&#xff1a; 上面的标题栏非常碍眼&#xff0c;要想隐藏标题栏的话&#xff0c;可以在Manifest文件的theme标签里进行配置&#xff0c;自定义一个theme&#xff0c;加上如下两句。或者直接在当前th…

OpenJDK作为Linux上的默认Java

大家好&#xff0c; 最近&#xff0c;我收到了很多人的私人来信&#xff0c;他们对Linux的默认Java软件包的更改感到困惑/担心。 对于许多Linux发行版&#xff0c;Java的Sun / Oracle官方版本已打包为该平台的默认Java。 但是&#xff0c;由于最近的许可更改&#xff0c;情况将…

力扣 数组中的第K个最大元素

给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 分析&#xff1a;这是个排序题&#xff0c;只要排好序&#xff0c;一切迎刃而解。我决定把排序…

Ajax应用需要注意的事项

接触Ajax&#xff0c;那时候的Ajax支持还不是很好&#xff0c;都要涉及底层&#xff0c;没有现成的框架给你调用。现在把常见的问题列举如下。 1、编码问题 注意AJAX要取的文件是UTF-8编码的。GB2312编码传回BROWSE后中文会乱码。如果用VBScript的话还可以转化&#xff0c;但是…

Xcode插件

古人云“工欲善其事必先利其器”&#xff0c;打造一个强大的开发环境&#xff0c;是立即提升自身战斗力的绝佳途径&#xff01;以下是搜集的一些有力的XCode插件。1.全能搜索家CodePilot 2.0你要找的是文件&#xff1f;是文件夹&#xff1f;是代码&#xff1f;Never Mind&#…