{"id":50540,"date":"2010-06-02T17:51:50","date_gmt":"2010-06-02T14:51:50","guid":{"rendered":"https:\/\/www.altoros.com\/blog\/?p=50540"},"modified":"2020-05-12T16:54:29","modified_gmt":"2020-05-12T13:54:29","slug":"some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java","status":"publish","type":"post","link":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/","title":{"rendered":"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_79_2 counter-hierarchy ez-toc-counter ez-toc-transparent ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Table of Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"Toggle Table of Content\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#The_task\" >The task<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#The_solution\" >The solution<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#Further_reading\" >Further reading<\/a><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"The_task\"><\/span>The task<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-50541\" style=\"margin: 10px;\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/02\/ZK-framework.jpg\" alt=\"\" width=\"157\" height=\"155\" \/>We do not intend to write a lot about what the ZK framework really is and what the pros and cons of using it are. To learn about such things, feel free to go to <a href=\"https:\/\/www.zkoss.org\/product\" rel=\"noopener noreferrer\" target=\"_blank\">the product&#8217;s website<\/a> where you can find almost everything you need to know about ZK. Why did we say \u201calmost?\u201d In our opinion, the framework lacks detailed documentation.<\/p>\n<p>However, let\u2019s take a look at a real-world scenario\u2014say, an auto-complete combobox\u2014and describe its implementation.<\/p>\n<p>Let\u2019s assume that we want to implement a drop-down component that will be automatically filled with elements, as soon as we start typing something in it. You can find something like this, for example, on the websites that sell airline tickets. There, you start typing a departure or a destination city, and a component brings and displays the list of all available cities, which names begin with these letters. We are going to implement such a component using the ZK framework.<\/p>\n<p>From the first glance, it may seem that we already have a component that provides exactly the same functionality: an auto-complete combobox that comes with ZK and takes a collection of items as an input and which auto-completeness is triggered by setting an auto-drop tag attribute value to <em>true<\/em>.<\/p>\n<p><code style=\"color: black; background-color: #e6e6e6;\">&lt;combobox autodrop=\"true\"\/&gt;<\/code><\/p>\n<p>So far so good. If a collection is small enough, then everything is fine: the component displays items, the sun shines brightly, the customer is happy, and the developer may go to the dining room to have a cup of coffee. What if the collection passed to the component consists of hundreds or thousands of elements? Such approach results in two bottlenecks: component collection handling and database access. This is not what we want, since everyone knows how sluggish projects often end up. For this reason, we are going to play a bit with ZK and Java to enrich our combobox\u2019s functionality.<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"The_solution\"><\/span>The solution<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>We will start building our custom component with overriding the method that returns a portion of data to be displayed to the end user. The method can be found in the <a href=\"https:\/\/www.zkoss.org\/javadoc\/latest\/zk\/org\/zkoss\/zul\/ListSubModel.html\" rel=\"noopener noreferrer\" target=\"_blank\">org.zkoss.zul.ListSubModel<\/a> interface. Generally speaking, we can develop a class that implements this interface. However, we decided not to repeat something that has already been done before us and decided to utilize <a href=\"https:\/\/www.zkoss.org\/javadoc\/latest\/zk\/org\/zkoss\/zul\/SimpleListModel.html\" rel=\"noopener noreferrer\" target=\"_blank\">org.zkoss.zul.SimpleListModel<\/a>. We should also admit that if we override getSubModel that fetches all the necessary items from the database, we will not need a \u201ccomplete\u201d combobox model. Passing the empty list to the model constructor will be enough, and it is also <code style=\"color: black; background-color: #e6e6e6;\">NullPointerException<\/code> safe.<\/p>\n<p>Additionally, let\u2019s assume that every combobox has a query name that is utilized to fetch data from the database. It can be a name of a query that returns a list of cities, countries, pets, etc. The getSubModel method should use this name to get the chunk of data from the database that will be fed to the combobox. We&#8217;re not going to describe here how it can be done, since\u2014we think\u2014it is quite obvious. What we need so far is a query name and a number of items to be returned from the database.<\/p>\n<p>The last trick is to use the Flyweight pattern. One can notice that the query name, starting symbols, and the size of the sample will uniquely define the collection\u2014provided that the database is unchangeable. We&#8217;re going to utilize this feature to avoid memory overuse.<\/p>\n<p>So, now it is time to write the code. The snippet below demonstrates what we have got so far.<\/p>\n<pre style=\"padding-left: 20px;\">private Combobox autodropCombobox;\r\n\r\n\/\/ \u2026\r\n\r\n\/\/ Inside the initialization method\r\nautodropCombobox.setModel(new SimpleListModel(Collections.emptyList()) {\r\n    public ListModel getSubModel(Object value, int nRows) {\r\n        if (value != null &amp;&amp; StringUtils.isNotEmpty(queryName)) {\r\n            String nameStartsWith = value.toString();\r\n            List data = someService.getItems(itemsNumber, nameStartsWith);\r\n            return ListModelFlyweight.create(data, nameStartsWith, queryName);\r\n        }\r\n        return ListModelFlyweight.create(Collections.emptyList(), EMPTY_STRING, queryName);\r\n    }\r\n});<\/pre>\n<p><code style=\"color: black; background-color: #e6e6e6;\">autodropCombobox<\/code> is a combobox we are working with, <code style=\"color: black; background-color: #e6e6e6;\">value<\/code> includes starting symbols, <code style=\"color: black; background-color: #e6e6e6;\">queryName<\/code> is a name of a query, <code style=\"color: black; background-color: #e6e6e6;\">itemsNumber<\/code> is a number of items to fetch, <code style=\"color: black; background-color: #e6e6e6;\">EMPTY_STRING<\/code> is a constant and an empty string. <code style=\"color: black; background-color: #e6e6e6;\">StringUtils<\/code> is a utility class from Apache Commons. The only thing left is to implement <code style=\"color: black; background-color: #e6e6e6;\">ListModelFlyweight<\/code>. Below you can find how it can be done.<\/p>\n<pre style=\"padding-left: 20px;\">public final class ListModelFlyweight extends SimpleListModel {\r\n    private static final WeakHashMap&lt; ListModelFlyweight, WeakReference&lt; ListModelFlyweight &gt;&gt; FLYWEIGHT_DATA =\r\n            new WeakHashMap&lt; ListModelFlyweight, WeakReference&lt; ListModelFlyweight &gt;&gt;();\r\n\r\n    private final Long dataSize;\r\n\r\n    private final String nameStartsWith;\r\n\r\n    private final String queryName;\r\n\r\n    public ListModelFlyweight (List modelData, String nameStartsWith, String queryName) {\r\n        super(modelData);\r\n        this.dataSize = modelData != null ? modelData.size() : 0L;\r\n        this.nameStartsWith = nameStartsWith;\r\n        this.queryName = queryName;\r\n    }\r\n\r\n    public static ListModelFlyweight create(List modelData, String nameStartsWith, String queryName) {\r\n        ListModelFlyweight model = new ListModelFlyweight (modelData, nameStartsWith, queryName);\r\n        if (!FLYWEIGHT_DATA.containsKey(model)) {\r\n            FLYWEIGHT_DATA.put(model, new WeakReference&lt; ListModelFlyweight &gt;(model));\r\n        }\r\n        return FLYWEIGHT_DATA.get(model).get();\r\n    }\r\n\r\n    @Override\r\n    public boolean equals(Object obj) {\r\n        if (obj instanceof ListModelFlyweight) {\r\n            if (obj == this) {\r\n                return true;\r\n            }\r\n            ListModelFlyweight other = (ListModelFlyweight) obj;\r\n            return other.dataSize.equals(dataSize) &amp;&amp; other.queryName.equals(queryName) &amp;&amp;\r\n                    (nameStartsWith != null ? nameStartsWith.equals(other.nameStartsWith) : (other.nameStartsWith == null));\r\n        }\r\n        return false;\r\n    }\r\n\r\n    @Override\r\n    public int hashCode() {\r\n        return ((dataSize != null ? dataSize.hashCode() : 0) * 17 + (nameStartsWith != null ? nameStartsWith.hashCode() : 1) * 33 + queryName.hashCode() + 9);\r\n    }\r\n}<\/pre>\n<p>So, the result is the custom component that can be utilized across multiple cases. To our mind, it is user-friendly and simple.<\/p>\n<p style=\"text-align: center;\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-50542\" src=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/02\/combobox_autocomplete.png\" alt=\"\" width=\"154\" height=\"96\" \/><\/p>\n<p>What do you think about this implementation?<\/p>\n<p>&nbsp;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Further_reading\"><\/span>Further reading<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ul>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/how-to-speed-up-angularjs-apps-that-use-internalization-libraries\/\">How to Speed Up AngularJS Apps That Use Internalization Libraries<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/ajax-on-rails\">AJAX on Rails<\/a><\/li>\n<li><a href=\"https:\/\/www.altoros.com\/blog\/mandrill-free-smtp-server-for-applications-2\/\">Mandrill\u2014a Free SMTP Server for Applications<\/a><\/li>\n<\/ul>\n<hr\/>\n<p><center><small>The post was written by Sergey Titov (Senior Java Developer at Altoros) and edited by <a href=\"https:\/\/www.altoros.com\/blog\/author\/olga\/\">Olga Belokurskaya<\/a>.<\/small><\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>The task<\/p>\n<p>We do not intend to write a lot about what the ZK framework really is and what the pros and cons of using it are. To learn about such things, feel free to go to the product&#8217;s website where you can find almost everything you need to know about [&#8230;]<\/p>\n","protected":false},"author":81,"featured_media":50550,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"content-type":"","footnotes":"","_links_to":"","_links_to_target":""},"categories":[214],"tags":[895],"class_list":["post-50540","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-tutorials","tag-research-and-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.6 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros<\/title>\n<meta name=\"description\" content=\"With code samples, we demonstrate how to implement an auto-complete combobox under a real-world scenario.\" \/>\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.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros\" \/>\n<meta property=\"og:description\" content=\"The task We do not intend to write a lot about what the ZK framework really is and what the pros and cons of using it are. To learn about such things, feel free to go to the product&#8217;s website where you can find almost everything you need to know about [...]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\" \/>\n<meta property=\"og:site_name\" content=\"Altoros\" \/>\n<meta property=\"article:published_time\" content=\"2010-06-02T14:51:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2020-05-12T13:54:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif\" \/>\n\t<meta property=\"og:image:width\" content=\"640\" \/>\n\t<meta property=\"og:image:height\" content=\"360\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/gif\" \/>\n<meta name=\"author\" content=\"Olga Belokurskaya\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Olga Belokurskaya\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\",\"name\":\"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros\",\"isPartOf\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif\",\"datePublished\":\"2010-06-02T14:51:50+00:00\",\"dateModified\":\"2020-05-12T13:54:29+00:00\",\"author\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/b4c29d31973f82a70fcb5e68c5aa5b60\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif\",\"width\":640,\"height\":360},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.altoros.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#website\",\"url\":\"https:\/\/www.altoros.com\/blog\/\",\"name\":\"Altoros\",\"description\":\"Insight\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.altoros.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/b4c29d31973f82a70fcb5e68c5aa5b60\",\"name\":\"Olga Belokurskaya\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/04\/Olga-Belokurskaya-96x96.jpg\",\"contentUrl\":\"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/04\/Olga-Belokurskaya-96x96.jpg\",\"caption\":\"Olga Belokurskaya\"},\"description\":\"Olga Belokurskaya is a writer with a long history of working in the information technology and services industry. She has broad expertise in writing news and articles on cloud computing, data integration, and software product development. Olga is adept at holding interviews with business owners and representatives. In addition, she has experience working as an interpreter and communications specialist.\",\"url\":\"https:\/\/www.altoros.com\/blog\/author\/olga\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros","description":"With code samples, we demonstrate how to implement an auto-complete combobox under a real-world scenario.","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.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/","og_locale":"en_US","og_type":"article","og_title":"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros","og_description":"The task We do not intend to write a lot about what the ZK framework really is and what the pros and cons of using it are. To learn about such things, feel free to go to the product&#8217;s website where you can find almost everything you need to know about [...]","og_url":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/","og_site_name":"Altoros","article_published_time":"2010-06-02T14:51:50+00:00","article_modified_time":"2020-05-12T13:54:29+00:00","og_image":[{"width":640,"height":360,"url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif","type":"image\/gif"}],"author":"Olga Belokurskaya","twitter_misc":{"Written by":"Olga Belokurskaya","Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/","url":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/","name":"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java | Altoros","isPartOf":{"@id":"https:\/\/www.altoros.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage"},"image":{"@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage"},"thumbnailUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif","datePublished":"2010-06-02T14:51:50+00:00","dateModified":"2020-05-12T13:54:29+00:00","author":{"@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/b4c29d31973f82a70fcb5e68c5aa5b60"},"breadcrumb":{"@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#primaryimage","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2010\/06\/ZK-Framework.gif","width":640,"height":360},{"@type":"BreadcrumbList","@id":"https:\/\/www.altoros.com\/blog\/some-tricks-on-how-to-optimize-an-auto-complete-combobox-using-zk-and-java\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.altoros.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Some Tricks on How to Optimize an Auto-Complete Combobox Using ZK and Java"}]},{"@type":"WebSite","@id":"https:\/\/www.altoros.com\/blog\/#website","url":"https:\/\/www.altoros.com\/blog\/","name":"Altoros","description":"Insight","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.altoros.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/b4c29d31973f82a70fcb5e68c5aa5b60","name":"Olga Belokurskaya","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.altoros.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/04\/Olga-Belokurskaya-96x96.jpg","contentUrl":"https:\/\/www.altoros.com\/blog\/wp-content\/uploads\/2020\/04\/Olga-Belokurskaya-96x96.jpg","caption":"Olga Belokurskaya"},"description":"Olga Belokurskaya is a writer with a long history of working in the information technology and services industry. She has broad expertise in writing news and articles on cloud computing, data integration, and software product development. Olga is adept at holding interviews with business owners and representatives. In addition, she has experience working as an interpreter and communications specialist.","url":"https:\/\/www.altoros.com\/blog\/author\/olga\/"}]}},"_links":{"self":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/50540","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/users\/81"}],"replies":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/comments?post=50540"}],"version-history":[{"count":24,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/50540\/revisions"}],"predecessor-version":[{"id":50544,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/posts\/50540\/revisions\/50544"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media\/50550"}],"wp:attachment":[{"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/media?parent=50540"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/categories?post=50540"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.altoros.com\/blog\/wp-json\/wp\/v2\/tags?post=50540"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}