{"id":351,"date":"2011-01-14T00:35:00","date_gmt":"2011-01-14T00:35:00","guid":{"rendered":"http:\/\/www.javacodegeeks.com\/2012\/10\/advanced-smartgwt-tutorial-part-1.html"},"modified":"2012-10-21T19:33:23","modified_gmt":"2012-10-21T19:33:23","slug":"advanced-smartgwt-tutorial-part-1","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html","title":{"rendered":"Advanced SmartGWT Tutorial, Part 1"},"content":{"rendered":"<p>Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with <a href=\"http:\/\/code.google.com\/p\/smartgwt\/\">SmartGWT<\/a> and <a href=\"http:\/\/www.javacodegeeks.com\/?tag=gwt\">GWT<\/a> in general, we decided to create the interface using <a href=\"http:\/\/code.google.com\/p\/smartgwt\/\">SmartGWT<\/a>. We really liked the visual components (check out the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/showcase\">SmartGWT showcase<\/a>) and the fact that it facilitates rapid development. <\/p>\n<p>In this tutorial I am going to show you how we created the prototype for our UI in just a few hours. The interface is heavily influenced by the <a href=\"http:\/\/www.jboss.org\/drools\/drools-guvnor.html\">Drools Guvnor<\/a> application. We use Drools in a lot of our projects and we have Guvnor for the business rules creation. We simply love the user interface, it is both visually beautiful and functionally practical. Check out some <a href=\"http:\/\/www.google.com\/images?q=drools+guvnor&amp;hl=en&amp;prmd=iv&amp;source=lnms&amp;tbs=isch:1&amp;ei=Zs4ITZDJComh8QPKwOUK&amp;sa=X&amp;oi=mode_link&amp;ct=mode&amp;ved=0CAcQ_AU&amp;biw=1600&amp;bih=688\">Guvnor screenshots<\/a>.<\/p>\n<p>Let&#8217;s get started. I assume you have already <a href=\"http:\/\/code.google.com\/webtoolkit\/gettingstarted.html\">installed the GWT SDK<\/a> and the <a href=\"http:\/\/code.google.com\/eclipse\/\">Google plugin for Eclipse<\/a>. SmartGWT is compatible with GWT 1.5.3 , GWT 1.6.4, GWT 1.7.x and GWT 2.0.x. Currently, I am using the <a href=\"http:\/\/code.google.com\/webtoolkit\/download.html\">GWT 2.1.0 SDK<\/a> and the <a href=\"http:\/\/code.google.com\/p\/smartgwt\/downloads\/list\">SmartGWT 2.2<\/a> version. In essence, this is a somewhat more advanced tutorial regarding SmartGWT, thus you might have to check my introductory <a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/getting-started-smartgwt-gwt-interfaces.html\">\u201cGetting Started with SmartGWT for awesome GWT interfaces\u201d<\/a> tutorial. Additionally, another helpful resource is the <a href=\"http:\/\/uptick.com.au\/content\/layout-user-interface\">\u201cLayout the User Interface\u201d<\/a> tutorial which we used to kick-start the development of our own interface.<\/p>\n<p>First we create a new \u201cWeb Application Project\u201d in Eclipse. I chose \u201cAwesomeSmartGWTUIProject\u201d for the project name and \u201ccom.javacodegeeks.smartgwt.appui\u201d for the package name.<\/p>\n<p><a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TS92M1mDZWI\/AAAAAAAAAQ8\/9tD28uOMHpU\/s1600\/01-smartgwt-eclipse-project.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TS92M1mDZWI\/AAAAAAAAAQ8\/9tD28uOMHpU\/s320\/01-smartgwt-eclipse-project.png\" style=\"cursor: pointer;height: 320px;margin: 0px auto 10px;text-align: center;width: 314px\" \/><\/a><\/p>\n<p>Next, add the \u201csmartgwt.jar\u201d file from the extracted ZIP to the project&#8217;s classpath. Note that this file should also be added to the \u201cwar\/WEB-INF\/lib\u201d directory.<\/p>\n<p><a href=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TS92SxRn-HI\/AAAAAAAAARE\/Cc5AF7uPuGg\/s1600\/02-project-classpath.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/4.bp.blogspot.com\/_piNjpdpJZXA\/TS92SxRn-HI\/AAAAAAAAARE\/Cc5AF7uPuGg\/s320\/02-project-classpath.png\" style=\"cursor: pointer;height: 210px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>Then edit the module xml file (named \u201cAwesomeSmartGWTUIProject.gwt.xml\u201d) and add the following line after the standard \u201cinherits\u201d declarations:<\/p>\n<pre class=\"brush:xml\">&lt;inherits name=\"com.smartgwt.SmartGwt\"\/&gt;<\/pre>\n<p>In addition, comment out the existing section that declares the usage of the GWT theme:<\/p>\n<pre class=\"brush:xml\">&lt;!--&lt;inherits name='com.google.gwt.user.theme.standard.Standard'\/&gt; --&gt;<\/pre>\n<p>This is what the module XML file should look like:<\/p>\n<pre class=\"brush:xml\">&lt;?xml version=\"1.0\" encoding=\"UTF-8\"?&gt;\r\n&lt;module rename-to='awesomesmartgwtuiproject'&gt;\r\n  &lt;!-- Inherit the core Web Toolkit stuff.                        --&gt;\r\n  &lt;inherits name='com.google.gwt.user.User'\/&gt;\r\n\r\n  &lt;!-- Inherit the default GWT style sheet.  You can change       --&gt;\r\n  &lt;!-- the theme of your GWT application by uncommenting          --&gt;\r\n  &lt;!-- any one of the following lines.                            --&gt;\r\n  \r\n  &lt;!-- &lt;inherits name='com.google.gwt.user.theme.standard.Standard'\/&gt;  --&gt;\r\n  &lt;!-- &lt;inherits name='com.google.gwt.user.theme.chrome.Chrome'\/&gt; --&gt;\r\n  &lt;!-- &lt;inherits name='com.google.gwt.user.theme.dark.Dark'\/&gt;     --&gt;\r\n\r\n  &lt;!-- Other module inherits                                      --&gt;\r\n  &lt;inherits name=\"com.smartgwt.SmartGwt\"\/&gt;\r\n\r\n  &lt;!-- Specify the app entry point class.                         --&gt;\r\n  &lt;entry-point class='com.javacodegeeks.smartgwt.appui.client.AwesomeSmartGWTUIProject'\/&gt;\r\n\r\n  &lt;!-- Specify the paths for translatable code                    --&gt;\r\n  &lt;source path='client'\/&gt;\r\n  &lt;source path='shared'\/&gt;\r\n\r\n&lt;\/module&gt;\r\n<\/pre>\n<p>Next step is to erase some of the auto-generated code that exists in the \u201cAwesomeSmartGWTUIProject.html\u201d file and more specifically the H1 and Table tags. This is what you should be left with:<\/p>\n<pre class=\"brush:xml\">&lt;!doctype html&gt;\r\n&lt;!-- The DOCTYPE declaration above will set the    --&gt;\r\n&lt;!-- browser's rendering engine into               --&gt;\r\n&lt;!-- \"Standards Mode\". Replacing this declaration  --&gt;\r\n&lt;!-- with a \"Quirks Mode\" doctype may lead to some --&gt;\r\n&lt;!-- differences in layout.                        --&gt;\r\n\r\n&lt;html&gt;\r\n  &lt;head&gt;\r\n    &lt;meta http-equiv=\"content-type\" content=\"text\/html; charset=UTF-8\"&gt;\r\n\r\n    &lt;!--                                                               --&gt;\r\n    &lt;!-- Consider inlining CSS to reduce the number of requested files --&gt;\r\n    &lt;!--                                                               --&gt;\r\n    &lt;link type=\"text\/css\" rel=\"stylesheet\" href=\"AwesomeSmartGWTUIProject.css\"&gt;\r\n\r\n    &lt;!--                                           --&gt;\r\n    &lt;!-- Any title is fine                         --&gt;\r\n    &lt;!--                                           --&gt;\r\n    &lt;title&gt;Web Application Starter Project&lt;\/title&gt;\r\n    \r\n    &lt;!--                                           --&gt;\r\n    &lt;!-- This script loads your compiled module.   --&gt;\r\n    &lt;!-- If you add any GWT meta tags, they must   --&gt;\r\n    &lt;!-- be added before this line.                --&gt;\r\n    &lt;!--                                           --&gt;\r\n    &lt;script type=\"text\/javascript\" language=\"javascript\" src=\"awesomesmartgwtuiproject\/awesomesmartgwtuiproject.nocache.js\"&gt;&lt;\/script&gt;\r\n  &lt;\/head&gt;\r\n\r\n  &lt;!--                                           --&gt;\r\n  &lt;!-- The body can have arbitrary html, or      --&gt;\r\n  &lt;!-- you can leave the body empty if you want  --&gt;\r\n  &lt;!-- to create a completely dynamic UI.        --&gt;\r\n  &lt;!--                                           --&gt;\r\n  &lt;body&gt;\r\n\r\n    &lt;!-- OPTIONAL: include this if you want history support --&gt;\r\n    &lt;iframe src=\"javascript:''\" id=\"__gwt_historyFrame\" tabIndex='-1' style=\"position:absolute;width:0;height:0;border:0\"&gt;&lt;\/iframe&gt;\r\n    \r\n    &lt;!-- RECOMMENDED if your web app will not function without JavaScript enabled --&gt;\r\n    &lt;noscript&gt;\r\n      &lt;div style=\"width: 22em; position: absolute; left: 50%; margin-left: -11em; color: red; background-color: white; border: 1px solid red; padding: 4px; font-family: sans-serif\"&gt;\r\n        Your web browser must have JavaScript enabled\r\n        in order for this application to display correctly.\r\n      &lt;\/div&gt;\r\n    &lt;\/noscript&gt;\r\n    \r\n  &lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>Similarly, remove all the code existing in your <a href=\"http:\/\/google-web-toolkit.googlecode.com\/svn\/javadoc\/2.0\/index.html?com\/google\/gwt\/core\/client\/EntryPoint.html\">EntryPoint<\/a> class, named \u201cAwesomeSmartGWTUIProject\u201d, and just leave an empty <a href=\"http:\/\/google-web-toolkit.googlecode.com\/svn\/javadoc\/2.0\/com\/google\/gwt\/core\/client\/EntryPoint.html#onModuleLoad%28%29\">onModuleLoad<\/a> method like the following:<div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client;\r\n\r\nimport com.google.gwt.core.client.EntryPoint;\r\n\r\npublic class AwesomeSmartGWTUIProject implements EntryPoint {\r\n    \r\n    public void onModuleLoad() {\r\n        \r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>We are now ready to start writing SmartGWT code, so make sure you have the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/\">SmartGWT Javadocs<\/a> bookmarked. There are two very important classes that we will continually use while building the interface.<\/p>\n<ul>\n<li><a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/HLayout.html\">HLayout<\/a>: This is a layout related class that applies a sizing policy along the horizontal axis, i.e. all their internal components will be placed in a horizontal manner.<\/li>\n<li><a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/VLayout.html\">VLayout<\/a>: This is a layout related class that applies a sizing policy along the vertical axis, i.e. all their internal components will be placed in a vertical manner.<\/li>\n<\/ul>\n<p>Those classes both extend from the parent <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/Layout.html\">Layout<\/a>, thus they inherit the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/Layout.html#addMember%28com.google.gwt.user.client.ui.Widget%29\">addMember<\/a> method that allows them to add other <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Canvas.html\">Canvas<\/a> objects or <a href=\"http:\/\/google-web-toolkit.googlecode.com\/svn\/javadoc\/1.6\/com\/google\/gwt\/user\/client\/ui\/Widget.html?is-external=true\">Widget<\/a>s.<\/p>\n<p>Using various layout objects we will break down the whole screen area to specific sub-areas (north, south, east, west and main). Let&#8217;s see how our first version of the entry point class looks like:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client;\r\n\r\nimport com.google.gwt.core.client.EntryPoint;\r\nimport com.google.gwt.user.client.Window;\r\nimport com.google.gwt.user.client.ui.RootLayoutPanel;\r\nimport com.javacodegeeks.smartgwt.appui.client.ui.ApplicationMenu;\r\nimport com.javacodegeeks.smartgwt.appui.client.ui.HeaderArea;\r\nimport com.javacodegeeks.smartgwt.appui.client.ui.MainArea;\r\nimport com.javacodegeeks.smartgwt.appui.client.ui.NavigationArea;\r\nimport com.smartgwt.client.widgets.layout.HLayout;\r\nimport com.smartgwt.client.widgets.layout.VLayout;\r\n\r\npublic class AwesomeSmartGWTUIProject implements EntryPoint {\r\n    \r\n    private static final int HEADER_HEIGHT = 85;\r\n    \r\n    private VLayout mainLayout;\r\n    private HLayout northLayout;\r\n    private HLayout southLayout;\r\n    private VLayout eastLayout;\r\n    private HLayout westLayout;\r\n    \r\n    public void onModuleLoad() {\r\n        \r\n        Window.enableScrolling(false);\r\n        Window.setMargin(\"0px\");\r\n        \r\n        \/\/ main layout occupies the whole area\r\n        mainLayout = new VLayout();\r\n        mainLayout.setWidth100();\r\n        mainLayout.setHeight100();\r\n\r\n        northLayout = new HLayout();\r\n        northLayout.setHeight(HEADER_HEIGHT);\r\n\r\n        VLayout vLayout = new VLayout();\r\n        vLayout.addMember(new HeaderArea());\r\n        vLayout.addMember(new ApplicationMenu());\r\n        northLayout.addMember(vLayout);\r\n\r\n        westLayout = new NavigationArea();\r\n        westLayout.setWidth(\"15%\");\r\n        \r\n        eastLayout = new MainArea();\r\n        eastLayout.setWidth(\"85%\");\r\n        \r\n        southLayout = new HLayout();\r\n        southLayout.setMembers(westLayout, eastLayout);\r\n\r\n        mainLayout.addMember(northLayout);\r\n        mainLayout.addMember(southLayout);\r\n\r\n        \/\/ add the main layout container to GWT's root panel\r\n        RootLayoutPanel.get().add(mainLayout);\r\n\r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>Don&#8217;t worry about the compilation errors, we will create the necessary classes later. As you can see, we have broken the whole screen area to smaller blocks and using the SmartGWT API we have wired all the components together. Note the use of the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Canvas.html#setWidth100%28%29\">setWidth100<\/a> and <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Canvas.html#setHeight100%28%29\">setHeight100<\/a> methods, which conveniently allow the specific component to occupy the whole available area. Finally, the <a href=\"http:\/\/google-web-toolkit.googlecode.com\/svn\/javadoc\/2.0\/com\/google\/gwt\/user\/client\/ui\/RootLayoutPanel.html\">RootLayoutPanel<\/a> is the GWT class that gives us access to the root panel of the screen. Let&#8217;s now create the various components.<\/p>\n<p>* ApplicationMenu:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client.ui;\r\n\r\nimport com.smartgwt.client.types.Alignment;\r\nimport com.smartgwt.client.types.Overflow;\r\nimport com.smartgwt.client.widgets.Label;\r\nimport com.smartgwt.client.widgets.layout.HLayout;\r\n\r\npublic class ApplicationMenu extends HLayout {\r\n\r\n    private static final int APPLICATION_MENU_HEIGHT = 27;\r\n\r\n    private Label label;\r\n\r\n    public ApplicationMenu() {\r\n        \r\n        super();\r\n        this.setHeight(APPLICATION_MENU_HEIGHT);\r\n\r\n        label = new Label();\r\n        label.setContents(\"Application Menu\");\r\n        label.setAlign(Alignment.CENTER);\r\n        label.setOverflow(Overflow.HIDDEN);\r\n        \r\n        this.addMember(label);\r\n        \r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>Nothing special here, we have just added a <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Label.html\">Label<\/a> to the layout and set the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/types\/Alignment.html\">Alignment<\/a> to center.<\/p>\n<p>* HeaderArea:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client.ui;\r\n\r\nimport com.smartgwt.client.types.Alignment;\r\nimport com.smartgwt.client.types.Overflow;\r\nimport com.smartgwt.client.widgets.Img;\r\nimport com.smartgwt.client.widgets.Label;\r\nimport com.smartgwt.client.widgets.layout.HLayout;\r\n\r\npublic class HeaderArea extends HLayout {\r\n\r\n    private static final int HEADER_AREA_HEIGHT = 60;\r\n    \r\n    public HeaderArea() {\r\n\r\n        super();\r\n\r\n        this.setHeight(HEADER_AREA_HEIGHT);\r\n        \r\n        Img logo = new Img(\"jcg_logo.png\", 282, 60);\r\n\r\n        Label name = new Label();\r\n        name.setOverflow(Overflow.HIDDEN);  \r\n        name.setContents(\"Java 2 Java Developers Resource Center\"); \r\n        \r\n        HLayout westLayout = new HLayout();\r\n        westLayout.setHeight(HEADER_AREA_HEIGHT);    \r\n        westLayout.setWidth(\"70%\");\r\n        westLayout.addMember(logo);\r\n        westLayout.addMember(name);\r\n        \r\n        Label signedInUser = new Label();\r\n        signedInUser.setContents(\"<strong>Fabrizio Chami<\/strong>\");   \r\n\r\n        HLayout eastLayout = new HLayout();\r\n        eastLayout.setAlign(Alignment.RIGHT);  \r\n        eastLayout.setHeight(HEADER_AREA_HEIGHT);\r\n        eastLayout.setWidth(\"30%\");\r\n        eastLayout.addMember(signedInUser);\r\n        \r\n        this.addMember(westLayout);      \r\n        this.addMember(eastLayout);\r\n\r\n    }\r\n\r\n}\r\n<\/pre>\n<p>Similarly, quite simple. We have added an image using the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Img.html\">Img<\/a> class and providing the file&#8217;s name. Note that the image URL falls automatically under an \u201cimages\u201d folder, so basically the \u201cjcg_logo.png\u201d file must reside in the \u201cwar\/images\u201d folder.<\/p>\n<p>* NavigationArea:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client;\r\n\r\nimport com.smartgwt.client.types.Overflow;\r\nimport com.smartgwt.client.types.VisibilityMode;\r\nimport com.smartgwt.client.widgets.Label;\r\nimport com.smartgwt.client.widgets.layout.HLayout;\r\nimport com.smartgwt.client.widgets.layout.SectionStack;\r\nimport com.smartgwt.client.widgets.layout.SectionStackSection;\r\n\r\npublic class NavigationArea extends HLayout {\r\n\r\n    public NavigationArea() {\r\n        \r\n        super();\r\n        \r\n        this.setMembersMargin(20);  \r\n        this.setOverflow(Overflow.HIDDEN);\r\n        this.setShowResizeBar(true);\r\n        \r\n        final SectionStack sectionStack = new SectionStack();  \r\n        sectionStack.setVisibilityMode(VisibilityMode.MULTIPLE);\r\n        sectionStack.setShowExpandControls(true);\r\n        sectionStack.setAnimateSections(true);\r\n        sectionStack.setVisibilityMode(VisibilityMode.MUTEX);\r\n        sectionStack.setOverflow(Overflow.HIDDEN);\r\n        \r\n        SectionStackSection section1 = new SectionStackSection(\"Section 1\");\r\n        section1.setExpanded(true);\r\n        Label label1 = new Label();\r\n        label1.setContents(\"Label1\");\r\n        section1.addItem(label1);\r\n        \r\n        SectionStackSection section2 = new SectionStackSection(\"Section 2\");\r\n        section2.setExpanded(false);\r\n        Label label2 = new Label();\r\n        label2.setContents(\"Label2\");\r\n        label2.setOverflow(Overflow.AUTO);\r\n        label2.setPadding(10);\r\n        section2.addItem(label2);\r\n\r\n        SectionStackSection section3 = new SectionStackSection(\"Section 3\");\r\n        section3.setExpanded(false);\r\n        Label label3 = new Label();\r\n        label3.setContents(\"Label3\");\r\n        label3.setOverflow(Overflow.AUTO);\r\n        label3.setPadding(10);\r\n        section3.addItem(label3);\r\n\r\n        sectionStack.addSection(section1);\r\n        sectionStack.addSection(section2);\r\n        sectionStack.addSection(section3);\r\n        \r\n        this.addMember(sectionStack);\r\n\r\n    }\r\n    \r\n}\r\n<\/pre>\n<p>For the navigation area we wanted an accordion like component. This is implemented in SmartGWT via the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/SectionStack.html\">SectionStack<\/a> class to which we add <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/layout\/SectionStackSection.html\">SectionStackSection<\/a> instances. To those items we can add arbitrary widgets, but for now we just add some <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Label.html\">Label<\/a>s for simplicity. Notice the use of the <a href=\"http:\/\/www.smartclient.com\/smartgwt\/javadoc\/com\/smartgwt\/client\/widgets\/Canvas.html#setShowResizeBar%28java.lang.Boolean%29\">setShowResizeBar<\/a> method, which allows us to show a re-size bar after this member in the layout, to allow it to be resized.<\/p>\n<p>* MainArea:<\/p>\n<pre class=\"brush:java\">package com.javacodegeeks.smartgwt.appui.client.ui;\r\n\r\nimport com.smartgwt.client.types.Alignment;\r\nimport com.smartgwt.client.types.Overflow;\r\nimport com.smartgwt.client.widgets.Label;\r\nimport com.smartgwt.client.widgets.layout.VLayout;\r\n\r\npublic class MainArea extends VLayout {\r\n    \r\n    private Label label;\r\n    \r\n    public MainArea() {\r\n        \r\n        super();\r\n\r\n        label = new Label();\r\n        label.setContents(\"Main Area\");\r\n        label.setAlign(Alignment.CENTER);\r\n        label.setOverflow(Overflow.HIDDEN);\r\n        \r\n        this.addMember(label);\r\n        \r\n    }\r\n\r\n}\r\n<\/pre>\n<p>The main area will host the bulk of our interface&#8217;s widgets, but for now includes only a label.<\/p>\n<p>OK, let&#8217;s see what we have done so far. Launch the Eclipse configuration (as a Web Application Project) and point your browser to the provided URL:<\/p>\n<p><a href=\"http:\/\/127.0.0.1:8888\/AwesomeSmartGWTUIProject.html?gwt.codesvr=127.0.0.1:9997\">http:\/\/127.0.0.1:8888\/AwesomeSmartGWTUIProject.html?gwt.codesvr=127.0.0.1:9997<\/a><\/p>\n<p>This is an image of what you should be seeing:<\/p>\n<p><a href=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TS93vhs-qfI\/AAAAAAAAARM\/9npJxXpkf3I\/s1600\/03-ui-skeleton.png\"><img decoding=\"async\" alt=\"\" border=\"0\" src=\"http:\/\/2.bp.blogspot.com\/_piNjpdpJZXA\/TS93vhs-qfI\/AAAAAAAAARM\/9npJxXpkf3I\/s320\/03-ui-skeleton.png\" style=\"cursor: pointer;height: 158px;margin: 0px auto 10px;text-align: center;width: 320px\" \/><\/a><\/p>\n<p>Not bad for a few minutes of code. Without having to mess with CSS, HTML and JavaScript we  have we have created the skeleton of our UI, which consists of strictly defined sub-areas. What is left is to beef it up by populating the areas with various fancy widgets.<\/p>\n<p>In the next part of this tutorial, I am going to introduce you to some of the most advanced components (like trees and tabs). For now, you can find <a href=\"http:\/\/dl.dropbox.com\/u\/7215751\/JavaCodeGeeks\/SmartGWTAdvancedTutorialPart1\/AwesomeSmartGWTUIProject_Part1.zip\">here<\/a> the Eclipse project created so far. Note that I have removed some of the SmartGWT specific stuff (images etc.) cause they bloated the archive. Those should be automatically created with a new project. The \u201cgwt-servlet.jar\u201d has also been removed from the \u201cwar\\WEB-INF\\lib\u201d directory.<\/p>\n<p>Happy UI coding!<\/p>\n<p>UPDATE: I have also published the <a href=\"http:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-2.html\">second part of this tutorial<\/a>.<\/p>\n<div style=\"margin: 0px\"><strong><i>Related Articles :<\/i><\/strong><\/div>\n<ul>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/getting-started-smartgwt-gwt-interfaces.html\">Getting Started with SmartGWT for awesome GWT interfaces<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/07\/add-json-gwt-application.html\">Add JSON capabilities into your GWT application<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/07\/building-your-own-gwt-spring-manen.html\">Building your own GWT Spring Maven Archetype<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/add-captcha-gwt-application.html\">Adding CAPTCHA to your GWT application<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/06\/gwt-spring-and-hibernate-enter-world-of.html\">GWT Spring and Hibernate enter the world of Data Grids<\/a><\/li>\n<li><a href=\"http:\/\/www.javacodegeeks.com\/2010\/05\/gwt-2-spring-3-jpa-2-hibernate-35.html\">GWT 2 Spring 3 JPA 2 Hibernate 3.5 Tutorial<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with SmartGWT and GWT in general, we decided to create the interface using SmartGWT. We really liked the visual components (check out the SmartGWT showcase) and the fact that it &hellip;<\/p>\n","protected":false},"author":3,"featured_media":125,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[8],"tags":[27,62],"class_list":["post-351","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-enterprise-java","tag-google-gwt","tag-smartgwt"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2011-01-14T00:35:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2012-10-21T19:33:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Ilias Tsagklis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Ilias Tsagklis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html\"},\"author\":{\"name\":\"Ilias Tsagklis\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\"},\"headline\":\"Advanced SmartGWT Tutorial, Part 1\",\"datePublished\":\"2011-01-14T00:35:00+00:00\",\"dateModified\":\"2012-10-21T19:33:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html\"},\"wordCount\":993,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-gwt-logo.jpg\",\"keywords\":[\"Google GWT\",\"SmartGWT\"],\"articleSection\":[\"Enterprise Java\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html\",\"name\":\"Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-gwt-logo.jpg\",\"datePublished\":\"2011-01-14T00:35:00+00:00\",\"dateModified\":\"2012-10-21T19:33:23+00:00\",\"description\":\"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-gwt-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/google-gwt-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2011\\\/01\\\/advanced-smartgwt-tutorial-part-1.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Enterprise Java\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/java\\\/enterprise-java\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Advanced SmartGWT Tutorial, Part 1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/9a83496b285d30c61e8a674625c1350e\",\"name\":\"Ilias Tsagklis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g\",\"caption\":\"Ilias Tsagklis\"},\"description\":\"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.\",\"sameAs\":[\"http:\\\/\\\/www.iliastsagklis.com\\\/\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/iliastsagklis\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/ilias-tsagklis\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks","description":"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html","og_locale":"en_US","og_type":"article","og_title":"Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks","og_description":"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with","og_url":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2011-01-14T00:35:00+00:00","article_modified_time":"2012-10-21T19:33:23+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg","type":"image\/jpeg"}],"author":"Ilias Tsagklis","twitter_card":"summary_large_image","twitter_creator":"@javacodegeeks","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Ilias Tsagklis","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html"},"author":{"name":"Ilias Tsagklis","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e"},"headline":"Advanced SmartGWT Tutorial, Part 1","datePublished":"2011-01-14T00:35:00+00:00","dateModified":"2012-10-21T19:33:23+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html"},"wordCount":993,"commentCount":2,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg","keywords":["Google GWT","SmartGWT"],"articleSection":["Enterprise Java"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html","url":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html","name":"Advanced SmartGWT Tutorial, Part 1 - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg","datePublished":"2011-01-14T00:35:00+00:00","dateModified":"2012-10-21T19:33:23+00:00","description":"Justin, Pat and I have started working on a side project that requires a user interface for administration and management. After working for a while with","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/google-gwt-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2011\/01\/advanced-smartgwt-tutorial-part-1.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"Java","item":"https:\/\/www.javacodegeeks.com\/category\/java"},{"@type":"ListItem","position":3,"name":"Enterprise Java","item":"https:\/\/www.javacodegeeks.com\/category\/java\/enterprise-java"},{"@type":"ListItem","position":4,"name":"Advanced SmartGWT Tutorial, Part 1"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/9a83496b285d30c61e8a674625c1350e","name":"Ilias Tsagklis","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/43505f28bb49f6e290c24be0b209ccc1af350f0f6587025ffd4847ef44bf6b78?s=96&d=mm&r=g","caption":"Ilias Tsagklis"},"description":"Ilias is a software developer turned online entrepreneur. He is co-founder and Executive Editor at Java Code Geeks.","sameAs":["http:\/\/www.iliastsagklis.com\/","https:\/\/www.linkedin.com\/in\/iliastsagklis"],"url":"https:\/\/www.javacodegeeks.com\/author\/ilias-tsagklis"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/351","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=351"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/351\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/125"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=351"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=351"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=351"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}