成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用JavaFX編寫(xiě)用戶(hù)界面控制器

開(kāi)發(fā) 后端
本文向您介紹使用JavaFX編寫(xiě)用戶(hù)界面控制器的相關(guān)知識(shí),通過(guò)實(shí)例來(lái)闡述要介紹的技巧和典型JavaFX結(jié)構(gòu)的陷阱。

在本文中,我們關(guān)心的是BlueBill Mobile類(lèi),尤其是管理所有Search Species屏幕之后邏輯的控制器;因此本文有助于你了解JavaFX的語(yǔ)言性能。而且我們會(huì)舉出一些實(shí)例來(lái)闡述要介紹的技巧和典型JavaFX結(jié)構(gòu)的陷阱。

筆者想應(yīng)用程序中嵌入了更新的屏播。視頻播放要求使用QucikTime。

這里的概念是在搜索框中鍵入查詢(xún)時(shí),英文函數(shù)或科學(xué)名稱(chēng)函數(shù)會(huì)對(duì)清單過(guò)濾。此外,當(dāng)這些生效的時(shí)候,BlueBill Mobile還可以執(zhí)行自動(dòng)完成輸入。例如,如果在鍵入查詢(xún)的時(shí)候你仔細(xì)查看視頻會(huì)發(fā)現(xiàn)只輸入了"a-r-d-a-c"來(lái)選擇"Ardea Cinerea";或用于"Pied Avocet"的"p-i-e-< space>-a"。BlueBill Mobile 會(huì)自動(dòng)會(huì)剩余部分進(jìn)行補(bǔ)充因?yàn)樵谀承┣闆r下,不存在其他選擇。這是用來(lái)改善移動(dòng)設(shè)備性能的重要功能:你可以以較少的輸入達(dá)到相同目的。

按照MVC模式,就非常有必要在單獨(dú)的控制器中概括這種模式;此外,也很容易對(duì)這種模式進(jìn)行單元測(cè)試。

首先,讓我們看一下代表了分類(lèi)群的模式類(lèi):

  1. package it.tidalwave.bluebillmfx.taxon.model;   
  2.   import java.lang.Comparable;  
  3.  
  4.   public class Taxon extends Comparable  
  5.  
  6.   {  
  7.  
  8.   public-read protected var displayName : String;  
  9.  
  10.   public-read protected var scientificName : String;  
  11.  
  12.   public-read protected var id : String;  
  13.  
  14.   override function compareTo (other : Object)  
  15.  
  16.   {  
  17.  
  18.   return displayName.compareTo((other as Taxon).displayName);  
  19.  
  20.   }  
  21.  
  22.   override function toString()  
  23.  
  24.   {  
  25.  
  26.   return "{displayName} ({scientificName}) ({id})" 
  27.  
  28.   }  
  29.  
  30.   }  
  31.  
  32.   public function displayNameGetter (taxon : Taxon): String  
  33.  
  34.   {  
  35.  
  36.   return taxon.displayName;  
  37.  
  38.   }  
  39.  
  40.   public function scientificNameGetter (taxon : Taxon): String  
  41.  
  42.   {  
  43.  
  44.   return taxon.scientificName;  
  45.  
  46.   }  
  47.  
  48.   public def namePropertyGetters = [displayNameGetter, scientificNameGetter];  

類(lèi)托架外面定義的函數(shù)和變量相當(dāng)于Java靜態(tài)分析。

這里我們省略了一些不相關(guān)的實(shí)際項(xiàng)目。基本上,該模式暴露了三個(gè)屬性,其中有意思的兩個(gè)分別是displayName和scientificName。我們也可以定義兩個(gè)函數(shù)來(lái)處理這兩個(gè)問(wèn)題,我們會(huì)把這些函數(shù)放在namePropertyGetters序列中。

  1.   package it.tidalwave.bluebillmfx.taxon.controller;   
  2.   import it.tidalwave.bluebillmfx.taxon.model.Taxon;  
  3.  
  4.   public class TaxonSearchController  
  5.  
  6.   {  
  7.  
  8.   public var selectedTaxon = bind if (selectedTaxonIndex < 0) then null else filteredTaxons[selectedTaxonIndex];  
  9.  
  10.   public var selectedTaxonIndex : Integer = -1;  
  11.  
  12.   public var taxons: Taxon[];  
  13.  
  14.   public var filter = "" on replace  
  15.  
  16.   {  
  17.  
  18.   filteredTaxons = taxons[taxon | matches(taxon, filter)];  
  19.  
  20.   update();  
  21.  
  22.   }  
  23.  
  24.   public-read var autoCompleted = "";  
  25.  
  26.   public var filteredTaxons: Taxon[];  
  27.  
  28.   protected function matches (taxon : Taxon, string: String) : Boolean  
  29.  
  30.   {  
  31.  
  32.   if (string == "")  
  33.  
  34.   {  
  35.  
  36.   return true;  
  37.  
  38.   }  
  39.  
  40.   for (propertyGetter in Taxon.namePropertyGetters)  
  41.  
  42.   {  
  43.  
  44.   if (propertyGetter(taxon).toLowerCase().startsWith(filter.toLowerCase()))  
  45.  
  46.   {  
  47.  
  48.   return true;  
  49.  
  50.   }  
  51.  
  52.   }  
  53.  
  54.   return false;  
  55.  
  56.   }  
  57.  
  58.   protected function update(): Void  
  59.  
  60.   {  
  61.  
  62.   def autoCompletedTry = commonLeadingSubstring(filteredTaxons, findMatchingPropertyGetter());  
  63.  
  64.   //  
  65.  
  66.   // Sometimes it can't find a better auto-completion than the current filter, since it searches the displayName  
  67.  
  68.   // and the scientificName at the same time. In this case, we just ignore the new value.  
  69.  
  70.   //  
  71.  
  72.   if (autoCompletedTry.length() > filter.length())  
  73.  
  74.   {  
  75.  
  76.   autoCompleted = autoCompletedTry;  
  77.  
  78.   }  
  79.  
  80.   selectedTaxonIndex = if (sizeof filteredTaxons == 1) then 0 else -1;  
  81.  
  82.   println("selectedTaxonIndex: {selectedTaxonIndex}")  
  83.  
  84.   }  
  85.  
  86.   protected function findMatchingPropertyGetter(): function (:Taxon): String  
  87.  
  88.   {  
  89.  
  90.   for (taxon in filteredTaxons)  
  91.  
  92.   {  
  93.  
  94.   for (propertyGetter in Taxon.namePropertyGetters)  
  95.  
  96.   {  
  97.  
  98.   if (propertyGetter(taxon).toLowerCase().startsWith(filter.toLowerCase()))  
  99.  
  100.   {  
  101.  
  102.   return propertyGetter;  
  103.  
  104.   }  
  105.  
  106.   }  
  107.  
  108.   }  
  109.  
  110.   return null;  
  111.  
  112.   }  
  113.  
  114.   // some stuff later  
  115.  
  116.   }  

這個(gè)類(lèi)揭示了以下的屬性:

◆taxons:你需要用完整的鳥(niǎo)類(lèi)列表來(lái)填充

◆filter: 字符串包括需要輸入到搜索欄中的文本

◆filteredTaxons: 種類(lèi)由filter字符串過(guò)濾

◆autoCompleted: 控制器猜測(cè)的自動(dòng)完成輸入字符串

◆selectedTaxon: 如果filter向下細(xì)分種類(lèi),它就會(huì)分配到這個(gè)變量

◆selectedTaxonIndex: -1如果無(wú)法獲取時(shí),selectedTaxon的索引。

最新的四種屬性由客戶(hù)代碼來(lái)綁定,這樣做可以獲取更改提示。#p#

Filter獲取了一個(gè)觸發(fā)事件,也就是變量值更改時(shí)所執(zhí)行的代碼。觸發(fā)器用JavaFX運(yùn)算符 ︳執(zhí)行了過(guò)濾操作:我們可以將觸發(fā)事件的第一行當(dāng)作分配到taxons序列中的filteredTaxons來(lái)讀取,在這一序列中,matches()函數(shù)返回值為true。第二行的代碼調(diào)用了接下來(lái)要介紹的update()函數(shù)。

出于某些原因,這種方法并不一定奏效,因?yàn)閒ilteredTaxons通常會(huì)被整體掃描。有多種方法可用來(lái)加速選擇過(guò)程,但是本文不會(huì)在這一方法真正應(yīng)用到手機(jī)前前作出過(guò)早的優(yōu)化。在筆記本上,它可以加快1000個(gè)項(xiàng)目的速度。

Matches()函數(shù)在所有屬性上執(zhí)行了一次迭代以獲取函數(shù)并檢查看相關(guān)屬性是否以過(guò)濾值啟動(dòng)。

創(chuàng)建獲得屬性值函數(shù)的序列的一大好處是我們可以通過(guò)定義新的函數(shù)輕松添加新的匹配標(biāo)準(zhǔn):例如,其他語(yǔ)言中的本地化名稱(chēng)。控制器可能會(huì)使用在搜索過(guò)程中使用這些名稱(chēng),而我們則不需要再做多余修改。

Update()函數(shù)運(yùn)算出了自動(dòng)完成輸入提示。它會(huì)提取filteredTaxons序列以及用于當(dāng)前選擇的獲取屬性函數(shù),還會(huì)調(diào)用剛剛在字符串屬性的序列中找到了通用子字符串的commonLeadingSubstring()。它不是每次都會(huì)作出很好的自動(dòng)完成輸入猜想,因此有時(shí)建議甚至比當(dāng)前過(guò)濾器還短,而這種情況我們大可忽略不計(jì)。請(qǐng)不要忽視指定臨時(shí)變量的重要性:由于自動(dòng)完成輸入可能被綁定,因此我們不想為其指定一個(gè)會(huì)迅速失效的值。

要明白這一點(diǎn)的重要性,這不僅僅是避免無(wú)用更新,還能避免程序被破壞。在實(shí)際程序中,自動(dòng)完成輸入更改時(shí),TextBox會(huì)更新,因此過(guò)濾器也會(huì)隨之更新:已經(jīng)輸入了"cal"后,再輸入一個(gè)"i",那么TextBox暫時(shí)會(huì)顯示"cali",然后自動(dòng)輸入完成的猜測(cè)失敗,它會(huì)返回一個(gè)"cal",TextBox中的字符串會(huì)變?yōu)?cal":這時(shí)候你要堅(jiān)持自己的想法!綁定確實(shí)很強(qiáng)大,但是它也同時(shí)具有負(fù)面效應(yīng)。

最后一步操作中,代碼會(huì)檢查看我們是否獲取單獨(dú)的已選定鳥(niǎo)類(lèi)。

或許,你對(duì)于自動(dòng)完成輸入失敗的原因仍然感到很困惑。畢竟,我們正在逐步縮小項(xiàng)目列表。因此,如果你已經(jīng)輸入了"cali",那么所有經(jīng)過(guò)過(guò)濾的種類(lèi)會(huì)以"cali"開(kāi)頭,對(duì)嗎?如果你過(guò)濾的是一套單一名稱(chēng),情況就應(yīng)該是這樣;但是我們是同時(shí)對(duì)兩套名稱(chēng)執(zhí)行搜索,那么就會(huì)產(chǎn)生矛盾。看看下例由"cali"過(guò)濾器選取的名稱(chēng)組(英語(yǔ),科學(xué)的):("Calandra Lark", "Melanocorypha calandra"), ("Dunlin", "Calidris alpina"), ("California Quail", "Callipepla californica")

另一個(gè)有意思的地方是findMatchPropertyGetter()。它必須猜測(cè)當(dāng)前過(guò)濾器是否是以"英語(yǔ)"或"科學(xué)"名稱(chēng)運(yùn)行,而且它還會(huì)返回相關(guān)的屬性獲取函數(shù)。基本上,控制器已經(jīng)獲取了matches()函數(shù)中的這一信息,但是我們會(huì)將其移走。可能會(huì)有人思考讓matches()函數(shù)返回一個(gè)以上的布林值,但是這是不可能的,因?yàn)樗怯蛇\(yùn)算符 ︳過(guò)濾序列的時(shí)候使用的:該運(yùn)算符需要一個(gè)布林值。或許我們可以為稍后調(diào)用信息的操作指定一個(gè)成員變量,不過(guò)此時(shí)的代碼應(yīng)該會(huì)更具可讀性。

為了對(duì)文章進(jìn)一步作補(bǔ)充說(shuō)明,這里給大家列出了最后兩個(gè)忽略的函數(shù):

  1. protected function commonLeadingSubstring (taxons: Taxon[], propertyGetter: function (:Taxon): String): String   
  2.   {  
  3.  
  4.   if (sizeof taxons == 0)  
  5.  
  6.   {  
  7.  
  8.   return "";  
  9.  
  10.   }  
  11.  
  12.   if (sizeof taxons == 1)  
  13.  
  14.   {  
  15.  
  16.   return propertyGetter(taxons[0]);  
  17.  
  18.   }  
  19.  
  20.   var common = propertyGetter(taxons[0]);  
  21.  
  22.   for (other in taxons[1..])  
  23.  
  24.   {  
  25.  
  26.   common = commonLeadingSubstring(common, propertyGetter(other));  
  27.  
  28.   if (common == "")  
  29.  
  30.   {  
  31.  
  32.   break// don't waste time in further iterations, "" it's for sure the final result  
  33.  
  34.   }  
  35.  
  36.   }  
  37.  
  38.   return root;  
  39.  
  40.   }  
  41.  
  42.   function commonLeadingSubstring (string1 : String, string2 : String): String  
  43.  
  44.   {  
  45.  
  46.   return if (string1.length() > string2.length())  
  47.  
  48.   {  
  49.  
  50.   commonLeadingSubstring(string2, string1);  
  51.  
  52.   }  
  53.  
  54.   else if (string1 == "")  
  55.  
  56.   {  
  57.  
  58.   "";  
  59.  
  60.   }  
  61.  
  62.   else if (string2.startsWith(string1))  
  63.  
  64.   {  
  65.  
  66.   string1;  
  67.  
  68.   }  
  69.  
  70.   else 
  71.  
  72.   {  
  73.  
  74.   commonLeadingSubstring(string1.substring(0, string1.length() - 1), string2);  
  75.  
  76.   }  
  77.  
  78.   } 

這里的邏輯很簡(jiǎn)單。通常主要的字符串搜索被分解成了臨近字符串對(duì);而對(duì)于單一對(duì)的搜索則有遞歸執(zhí)行。

這里顯示了視圖類(lèi)是如何綁定到控制器的:

  1. package it.tidalwave.bluebillmfx.taxon.view;   
  2.   public class TaxonSearchScreen  
  3.  
  4.   {  
  5.  
  6.   public var taxons : Taxon[];  
  7.  
  8.   var filter = "";  
  9.  
  10.   public-read def controller = TaxonSearchController  
  11.  
  12.   {  
  13.  
  14.   taxons: bind taxons  
  15.  
  16.   filter: bind filter  
  17.  
  18.   }  
  19.  
  20.   def autoCompleted = bind controller.autoCompleted on replace  
  21.  
  22.   {  
  23.  
  24.   if (autoCompleted != "")  
  25.  
  26.   {  
  27.  
  28.   filter = autoCompleted;  
  29.  
  30.   }  
  31.  
  32.   }  
  33.  
  34.   def list = ListBox  
  35.  
  36.   {  
  37.  
  38.   items: bind controller.filteredTaxons  
  39.  
  40.   };  
  41.  
  42.   def searchBox = TextBox  
  43.  
  44.   {  
  45.  
  46.   text: bind filter with inverse  
  47.  
  48.   };  
  49.  
  50.   } 

你必須用所有可得的種類(lèi)加載taxon;ListBox會(huì)隨著過(guò)濾的種類(lèi)自動(dòng)更新,TextBox與過(guò)濾器是雙重指令型綁定。之所以需要雙重綁定是因?yàn)橄蛩阉鳈谥休斎霑r(shí),一個(gè)指令用于給控制器發(fā)出新的選擇命令,另一個(gè)則是自動(dòng)完成輸入時(shí)的更新。

 

【編輯推薦】

  1. JavaFX 1.2中的三大重要特性
  2. Silverlight、JavaFX、Flex技術(shù)比較
  3. JavaFX和Java之間的互操作性
  4. JavaFX對(duì)Java開(kāi)發(fā)者到底意味著什么
  5. RIA之爭(zhēng) JavaFX是否能后來(lái)居上?
責(zé)任編輯:佚名 來(lái)源: IT專(zhuān)家網(wǎng)
相關(guān)推薦

2011-07-14 10:28:54

額外域控制器

2015-08-07 15:28:46

選取城市控制器源碼

2023-08-13 18:31:45

SDN控制器

2011-06-21 13:57:43

2011-08-02 18:40:14

域控制器

2011-07-12 09:29:10

主域控制器備份域控制器

2015-02-02 09:37:42

SDN控制器

2024-09-27 16:28:07

2011-08-01 16:59:27

活動(dòng)目錄域控制器

2015-10-20 14:52:50

Steam控制器Ubuntu

2009-01-12 11:16:58

控制器控制器行為行為結(jié)果

2019-11-17 22:58:03

Spring MVC控制器編寫(xiě)

2013-12-19 09:32:01

SDN南向網(wǎng)絡(luò)控制

2015-07-20 11:34:06

2013-06-08 09:50:30

SDN控制器應(yīng)用OpenFlow軟件定義網(wǎng)絡(luò)

2011-07-07 17:15:52

2015-05-26 10:16:27

SDNSDN控制器

2013-12-06 15:18:18

2015-07-14 11:09:26

SDN

2011-07-12 09:58:42

主域控制器備份域控制器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产高清在线精品 | 国产精品乱码一区二区三区 | 一区中文字幕 | www.亚洲一区 | 亚洲综合字幕 | 中文字幕久久久 | 精品欧美一区二区三区久久久小说 | av中文字幕网 | 黑人中文字幕一区二区三区 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 天天干天天操 | 欧美男人天堂 | 久久久久网站 | 在线一区| 先锋资源亚洲 | 国产美女在线精品免费 | 九九热免费观看 | 国产真实精品久久二三区 | 久久av一区 | 日韩欧美在线观看 | 天堂资源 | 99久久婷婷国产亚洲终合精品 | 一区二区精品视频 | 国产精品国产三级国产aⅴ中文 | 国产高清精品一区二区三区 | 国产精品99久久久久久www | 亚洲网站免费看 | 日韩在线观看一区 | 日韩在线免费 | 午夜免费在线电影 | 五月婷婷丁香婷婷 | 免费黄色a视频 | 香蕉一区 | 国产精品国产三级国产播12软件 | 日韩高清在线 | 日日操天天射 | 99精品视频一区二区三区 | 中文在线观看视频 | 一区二区三区回区在观看免费视频 | 午夜精品久久久久久久星辰影院 | 大香网伊人 |