日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Swing模型過(guò)濾技術(shù)詳解

簡(jiǎn)介

專(zhuān)注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)潤(rùn)州免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

模型過(guò)濾是這樣一種技術(shù),它在 Swing 組件體系結(jié)構(gòu)中提供附加的功能與靈活性。

Swing 體系結(jié)構(gòu)的重要?jiǎng)?chuàng)新之一在于采用了模型/視圖/控制器 (MVC) 原理,這樣就可將組件的不同角色分離開(kāi)。當(dāng)一種體系結(jié)構(gòu)具備 MVC 分離特性時(shí),即可對(duì)組件的數(shù)據(jù)與狀態(tài)作不同的解釋。這允許程序員在組件及其模型之間插入過(guò)濾器對(duì)象。模型過(guò)濾可以在模型內(nèi)修改數(shù)據(jù)的表示,還也可以改變模型所封裝數(shù)據(jù)的外在數(shù)目和順序。

Swing模型過(guò)濾的另外兩種重要特性是

Swing模型過(guò)濾操作不會(huì)改變底層的模型數(shù)據(jù)。這使得多個(gè)組件可以共享一組數(shù)據(jù),而且每個(gè)組件都可能以不同的方式解釋這組數(shù)據(jù)。

過(guò)濾器可以疊用,這樣就可以依次用幾個(gè)不同的過(guò)濾器對(duì)象來(lái)解釋模型數(shù)據(jù)。

已定義的代理

為了最大限度地利用 Java 平臺(tái)對(duì)面向?qū)ο蟮闹С郑梢院?jiǎn)單地認(rèn)為組件由若干對(duì)象構(gòu)成。這些對(duì)象可以由一個(gè)通用術(shù)語(yǔ) ― 代理 ― 來(lái)描述。代理是實(shí)現(xiàn)一個(gè)公共 Java 接口并與某個(gè)特定組件相關(guān)聯(lián)的對(duì)象。代理實(shí)現(xiàn)的接口定義代理在 MVC 體系結(jié)構(gòu)中充當(dāng)?shù)慕巧?/p>

對(duì)于剛剛接觸 Swing 的程序員而言,代理的概念似乎有些難以理解,但是,它們也是 AWT 組件的一種共同特征。例如,如果想更改 java.awt.Label 組件上的字體,只需創(chuàng)建或獲取 java.awt.Font 類(lèi)的一個(gè)實(shí)例,并且調(diào)用 getFont() 使該實(shí)例與組件相關(guān)聯(lián)。Font 對(duì)象的內(nèi)部運(yùn)作細(xì)節(jié)可能很有趣,但是組件只要有 Font 類(lèi)型對(duì)象的一個(gè)引用即可適當(dāng)?shù)仫@示自己。甚至像標(biāo)簽前景顏色這種簡(jiǎn)單概念也是通過(guò)代理實(shí)現(xiàn)的;java.awt.Color 類(lèi)提供一種適合作組件前景顏色的對(duì)象。作為一般規(guī)則,值為非基本數(shù)據(jù)類(lèi)型的各種組件屬性都可看作是代理。

Swing 中的 MVC 實(shí)現(xiàn)就是這些概念的體現(xiàn)。對(duì)象不僅用于表示組件的屬性值,也用于表示組件行為的諸多方面。這種方案相當(dāng)靈活,足以支持 Swing 的可插接外觀 (PLAF) 功能的實(shí)現(xiàn),該功能使應(yīng)用程序既可模擬本地平臺(tái)的外觀,也可用一種與平臺(tái)無(wú)關(guān)的方案顯示組件。PLAF 既可使應(yīng)用程序看起來(lái)就像 Microsoft Windows、 Mac OS 和 X/Motif 等平臺(tái)的本地應(yīng)用程序一樣,也可使應(yīng)用程序具有一種中立的外觀,稱(chēng)為 "Java" LAF 或 "Metal" LAF。

PLAF 功能與組件的外觀密切相關(guān)。本文主要討論這一體系結(jié)構(gòu)的模型部分,它與組件的外觀的無(wú)關(guān)。

作為一種模型(或類(lèi)似一種模型)

每種支持?jǐn)?shù)據(jù)與狀態(tài)的 Swing 組件都有一種與之相關(guān)的模型接口。無(wú)論接口感興趣的是封裝于該模型的數(shù)據(jù)還是狀態(tài),它都會(huì)包含允許組件以編程方式查詢模型內(nèi)容的若干方法。

每個(gè)模型接口都提供兩類(lèi)方法:一類(lèi)方法提供對(duì)數(shù)據(jù)與狀態(tài)的訪問(wèn),而另一類(lèi)方法允許組件或者其他對(duì)象注冊(cè)或取消注冊(cè)事件監(jiān)聽(tīng)程序。監(jiān)聽(tīng)程序的類(lèi)型及其提供的事件對(duì)象都由這些方法定義。

Swing 模型接口可以有不同類(lèi)型的類(lèi)實(shí)現(xiàn)。在許多情況下,為模型提供的是一種抽象實(shí)現(xiàn);除了為了觸發(fā)模型所表示的各種事件方法而提供的 protected 方法之外,這通常是一種不完全的正則實(shí)現(xiàn)。所有模型都有一個(gè)缺省實(shí)現(xiàn),并且是一個(gè)具體類(lèi)。

既好又簡(jiǎn)單 ― ListModel 接口

在開(kāi)始討論過(guò)濾之前,對(duì)典型的模型接口作一回顧不失為明智之舉。

ListModel 接口代表 JList 組件中的數(shù)據(jù)。這是三種集合模型中最簡(jiǎn)單的一種。(另外兩種分別是 JTree 和 JTable。) ListModel 有兩個(gè)方法用于檢索列表中的元素個(gè)數(shù)以及各個(gè)元素,另外還有兩個(gè)方法用于維護(hù)感興趣的監(jiān)聽(tīng)程序列表,以便監(jiān)聽(tīng)列表模型的變化。

ListModel 的簡(jiǎn)化源代碼

 
 
 
 
  1. 1 package javax.swing;
  2. 2 import javax.swing.event.ListDataListener;
  3. 3 public interface ListModel
  4. 4 {
  5. 5 int getSize();
  6. 6 Object getElementAt(int index);
  7. 7 void addListDataListener(ListDataListener listener);
  8. 8 void removeListDataListener(ListDataListener listener);
  9. 9 }

在 ListModel 接口中, getSize() 與 getElementAt() 方法用于遍歷模型中的元素,而其他兩個(gè)方法用于建立與感興趣的監(jiān)聽(tīng)程序之間的關(guān)聯(lián),以便監(jiān)聽(tīng)模型的變化。

ListDataListener 接口支持三個(gè)方法,當(dāng)模型監(jiān)聽(tīng)到其底層數(shù)據(jù)發(fā)生變化時(shí)就會(huì)調(diào)用這三個(gè)方法。這三個(gè)方法是 intervalAdded() 、 intervalRemoved() 和 contentsChanged() ,每個(gè)方法都接受單個(gè) ListDataEvent 作為參數(shù)。根據(jù)模型所發(fā)生變化的復(fù)雜程度之不同,模型實(shí)現(xiàn)可以使用其中的任一個(gè)方法來(lái)描述這些變化。通常, intervalAdded() 和 intervalRemoved() 用于描述變化的時(shí)間間隔;當(dāng)變化過(guò)于復(fù)雜,無(wú)法作為一個(gè)閉合間隔進(jìn)行描述時(shí),就會(huì)用到 contentsChanged() 。

為了理解模型過(guò)濾如何運(yùn)作,請(qǐng)記住這一點(diǎn):JList 組件只對(duì) ListModel API 的實(shí)現(xiàn)感興趣。該組件并不關(guān)心數(shù)據(jù)駐留何處以及數(shù)據(jù)是如何組織的。無(wú)論該模型是一個(gè)缺省類(lèi)、抽象類(lèi)的擴(kuò)展,還是 ListModel 接口的一種直接實(shí)現(xiàn),都不影響 JList 組件的行為。

#p#

Swing模型過(guò)濾的基本概念利用了 Swing 組件對(duì)模型類(lèi)的底層實(shí)現(xiàn)缺乏了解這一事實(shí)。下圖說(shuō)明了這種典型的關(guān)系:

模型過(guò)濾器是實(shí)現(xiàn)了模型接口、但并不真正包含數(shù)據(jù)的類(lèi)。模型過(guò)濾器在組件與其模型之間進(jìn)行協(xié)調(diào)。模型過(guò)濾器可以重新解釋模型所提供的信息,并且可以更改所提供的數(shù)據(jù)元素個(gè)數(shù)、數(shù)據(jù)的順序以及數(shù)據(jù)本身。

在本例中,Swing模型過(guò)濾類(lèi)是將一個(gè)現(xiàn)有模型類(lèi)作為其數(shù)據(jù)源來(lái)實(shí)例化的。在模型過(guò)濾器的一般實(shí)現(xiàn)中,對(duì) API 方法的調(diào)用將委托給源模型。

由于此 API 是統(tǒng)一實(shí)現(xiàn)的,因此完全可以在組件與其模型之間“疊放”多個(gè)過(guò)濾器。注意,每個(gè)過(guò)濾層都要求每個(gè) API 調(diào)用穿過(guò)一個(gè)附加的間接層;如果過(guò)濾層過(guò)于復(fù)雜,則很可能造成性能瓶頸。

基本過(guò)濾器

下面顯示的抽象類(lèi)是作用于 JList 組件之上的模型過(guò)濾器的基類(lèi)。其唯一的構(gòu)造函數(shù)要求,模型過(guò)濾器的每個(gè)實(shí)例都要引用某個(gè)底層的模型數(shù)據(jù)。該數(shù)據(jù)既可以是另一個(gè)模型過(guò)濾器,也可以不是;在這兩種情況下,過(guò)濾器的行為是相同的。

Swing模型過(guò)濾器基類(lèi)

 
 
 
 
  1. 1 package com.ketherware.models;
  2. 2 import javax.swing.*;
  3. 3 public abstract class AbstractListModelFilter extends AbstractListModel
  4. 4 {
  5. 5 // 用來(lái)保存被過(guò)濾模型的引用
  6. 6 protected ListModel delegate;
  7. 7 // 構(gòu)造函數(shù) ― 接受單個(gè)參數(shù),其中包含被過(guò)濾模型的引用
  8. 8 public AbstractListModelFilter(ListModel delegate)
  9. 9 {
  10. 10 this.delegate = delegate;
  11. 11 }
  12. 12 public ListModel getDelegate()
  13. 13 {
  14. 14 return this.delegate;
  15. 15 }
  16. 16 public int getSize()
  17. 17 {
  18. 18 // 委托給過(guò)濾器目標(biāo)
  19. 19 return delegate.getSize();
  20. 20 }
  21. 21 public Object getElementAt(int index)
  22. 22 {
  23. 23 // 委托給過(guò)濾器目標(biāo)
  24. 24 return delegate.getElementAt(index);
  25. 25 }
  26. 26 public void addListDataListener(ListDataListener listener)
  27. 27 {
  28. 28 // 委托給過(guò)濾器目標(biāo)
  29. 29 delegate.addListDataListener(listener);
  30. 30 }
  31. 31 public void removeListDataListener(ListDataListener listener)
  32. 32 {
  33. 33 // 委托給過(guò)濾器目標(biāo)
  34. 34
  35. 35 delegate.removeListDataListener(listener);
  36. 36 }
  37. 37 }

該類(lèi)相當(dāng)于一種“空”過(guò)濾器,它不更改任何底層數(shù)據(jù)。因此,它沒(méi)有什么特別的意義。ListModel 過(guò)濾器類(lèi)的實(shí)際實(shí)現(xiàn)將覆蓋該抽象類(lèi)的方法,以便以不同的方式呈現(xiàn)底層數(shù)據(jù)。

您可以通過(guò)實(shí)現(xiàn)過(guò)濾器來(lái)改變底層數(shù)據(jù)事件的特性。為了使對(duì)模型過(guò)濾器的討論更易于理解,本文的示例都只針對(duì)不可變的數(shù)據(jù)模型,即不觸發(fā)任何模型事件的類(lèi)。

缺省模型適合于要求不高的一般應(yīng)用。但是,您應(yīng)該了解這些缺省類(lèi)都是為通用目的而設(shè)計(jì)的,因此,在對(duì)性能有嚴(yán)格要求的情況下,它們通常表現(xiàn)不佳。同樣,許多常用的模型都是作為可變模型來(lái)實(shí)現(xiàn)的,即,模型的數(shù)據(jù)可隨時(shí)間變化。當(dāng)已知數(shù)據(jù)為靜態(tài)數(shù)據(jù)時(shí),這些額外的行為可能是多余的。因此,您可能想另外構(gòu)建模型類(lèi),去掉由事件傳播所導(dǎo)致的額外開(kāi)銷(xiāo)。

不可變模型

在許多情況下,根據(jù)模型的底層數(shù)據(jù)是否可變對(duì)模型進(jìn)行分類(lèi)很有用。在數(shù)據(jù)不會(huì)變化的情況下,可以實(shí)現(xiàn)不可變的數(shù)據(jù)模型,這種模型不實(shí)現(xiàn)用于監(jiān)聽(tīng)數(shù)據(jù)變化的監(jiān)聽(tīng)程序。Swing模型過(guò)濾接口的缺省實(shí)現(xiàn)假定數(shù)據(jù)是可變的。

不可變模型的創(chuàng)建過(guò)程相當(dāng)簡(jiǎn)單。您可以創(chuàng)建一個(gè)具體類(lèi),該類(lèi)可提供模型接口,但為與事件相關(guān)的活動(dòng)所提供的所有方法都不執(zhí)行任何操作。根據(jù)模型要作為一般模型使用,還是作為專(zhuān)用模型使用,您既可將此不可變模型實(shí)現(xiàn)為一個(gè)抽象類(lèi),也可將其實(shí)現(xiàn)為一個(gè)具體類(lèi)。

下面的示例是一個(gè)不可變的列表模型,我設(shè)計(jì)它時(shí)希望它非常通用,并且允許將支持 java.util.List 集合接口的任何對(duì)象用作數(shù)據(jù)源。返回的數(shù)據(jù)是一個(gè)籠統(tǒng)的 Object 類(lèi)型;如何顯示對(duì)象留待 JList 及其相關(guān)繪制程序解釋。

不可變模型的示例

 
 
 
 
  1. 1 package com.ketherware.models;
  2. 2 import java.util.*;
  3. 3 import javax.swing.*;
  4. 4 public abstract class ImmutableListModelFilter extends AbstractListModel
  5. 5 {
  6. 6 // 用來(lái)保存被過(guò)濾模型的引用
  7. 7 protected List collection;
  8. 8 // 構(gòu)造函數(shù) ― 接受單個(gè)參數(shù),其中包含被過(guò)濾模型的引用
  9. 9 public AbstractListModelFilter(List collection)
  10. 10 {
  11. 11 this.collection = collection;
  12. 12 }
  13. 13 public List getCollection()
  14. 14 {
  15. 15 return this.collection;
  16. 16 }
  17. 17 public int getSize()
  18. 18 {
  19. 19 // 委托給集合
  20. 20 return collection.size();
  21. 21 }
  22. 22 public Object getElementAt(int index)
  23. 23 {
  24. 24 // 委托給過(guò)濾器目標(biāo)
  25. 25 return collection.get(index);
  26. 26 }
  27. 27 public void addListDataListener(ListDataListener listener)
  28. 28 {
  29. 29 // 覆蓋為‘空操作’
  30. 30 }
  31. 31 public void removeListDataListener(ListDataListener listener)
  32. 32 {
  33. 33 // 覆蓋為‘空操作’
  34. 34 }
  35. 35 }

下面將討論四種類(lèi)型的過(guò)濾器:替換、排序、排除和包含。

#p#

替換Swing模型過(guò)濾的目的在于,重新解釋模型數(shù)據(jù),并且通過(guò)改變返回的對(duì)象元素來(lái)表示它。這種類(lèi)型的過(guò)濾器不改變數(shù)據(jù)元素的順序,它既不刪除數(shù)據(jù),也不創(chuàng)建額外的數(shù)據(jù)。

下面是一個(gè)替換過(guò)濾器的示例,它為底層模型中的每個(gè)數(shù)據(jù)項(xiàng)添加一個(gè)數(shù)字索引。唯一的變化是覆蓋了單個(gè)方法。

替換過(guò)濾器的示例

 
 
 
 
  1. 1 package com.ketherware.models;
  2. 2 import javax.swing.*;
  3. 3 public abstract class IndexingListModelFilter extends AbstractListModelFilter
  4. 4 {
  5. 5 public Object getElementAt(int index)
  6. 6 {
  7. 7 // 委托給過(guò)濾器目標(biāo)
  8. 8 String element = delegate.getElementAt(index).toString();
  9. 9 return Integer.toString(index) + ? ?+ element;
  10. 10 }
  11. 11 }

在許多情況下,在繪制程序中引入補(bǔ)充的特性可能更合適,比如填加一個(gè)行索引。您可以提供一個(gè)過(guò)濾器,它通過(guò)與繪制程序交互來(lái)提供額外的圖形表示。使用過(guò)濾器代替繪制程序的優(yōu)點(diǎn)在于,可用一個(gè)組件顯示經(jīng)過(guò)索引的數(shù)據(jù),而無(wú)須與繪制程序相關(guān)聯(lián)。

替換過(guò)濾器通常不覆蓋 getSize() ,而且不改變所返回元素的順序。

排序過(guò)濾器

排序過(guò)濾器代表了另一層面的復(fù)雜性。它們不改變所表示元素的個(gè)數(shù),在這一點(diǎn)上與替換過(guò)濾器類(lèi)似。排序過(guò)濾器改變模型中經(jīng)過(guò)索引的元素順序。其基本技術(shù)在于,創(chuàng)建模型元素的一種替代索引,用于代替實(shí)際的順序。

排序過(guò)濾器的一種常見(jiàn)類(lèi)型是分類(lèi)過(guò)濾器,它基于某個(gè)明確的排序順序重新索引數(shù)據(jù)。下面的示例按字母順序排列任一個(gè) ListModel 實(shí)現(xiàn)的內(nèi)容。

排序過(guò)濾器的示例

 
 
 
 
  1. 1 package com.ketherware.models;
  2. 2 import java.util.*;
  3. 3 import javax.swing.*;
  4. 4 public abstract class AlphaSortingListModelFilter extends
  5. 5 AbstractListModel
  6. 6 {
  7. 7 // 已排序的索引數(shù)組
  8. 8 protected ArrayList sortedIndex;
  9. 9 public AlphaSortingListModelFilter(ListModel delegate)
  10. 10 {
  11. 11 this.delegate = delegate;
  12. 12 resort();
  13. 13 }
  14. 14 // 該算法稱(chēng)為“插入排序”,適合于處理元素個(gè)數(shù)少于幾百個(gè)的數(shù)據(jù)。
  15. 15 // 它是一種“無(wú)堆?!迸判颉?
  16. 16 protected synchronized void resort()
  17. 17 {
  18. 18 sortedIndex = new ArrayList();
  19. 19 nextElement:
  20. 20 for (int x=0; x < delegate.getSize(); x++)
  21. 21 {
  22. 22 for (int y=0; y < x; y++)
  23. 23 {
  24. 24 String current =
  25. 25 delegate.getElementAt(x).toString();
  26. 26 int compareIndex =
  27. 27 ((Integer) sortedIndex.get(y)).intValue();
  28. 28 String compare =
  29. 29 sortedIndex.get(compareIndex).toString();
  30. 30 if (current.compareTo(compare) < 0)
  31. 31 {
  32. 32 sortedList.add(new Integer(x), y);
  33. 33 continue nextElement;
  34. 34 }
  35. 35 }
  36. 36 sortedList.add(new Integer(x));
  37. 37 }
  38. 38 }
  39. 39 public Object getElementAt(int index)
  40. 40 {
  41. 41 // 委托給過(guò)濾器目標(biāo),但使用已排序的索引
  42. 42 return delegate.getElementAt(sortedIndex[index]);
  43. 43 }
  44. 44 }

可以將一種排序過(guò)濾器用于 JTable 組件,以便對(duì)表數(shù)據(jù)執(zhí)行面向列的排序;這種過(guò)濾器的代碼類(lèi)似于上面的示例。通過(guò)修改 JTable 的表頭和表的模型組件,該過(guò)濾器可以得到進(jìn)一步的增強(qiáng)。

請(qǐng)注意,上面的示例只對(duì)不可變列表模型有效。如果數(shù)據(jù)在動(dòng)態(tài)變化,為了修改在事件被觸發(fā)時(shí)由 ListDataEvent 對(duì)象傳遞的索引,必須提供一些附加支持。這將顯著增加過(guò)濾器的復(fù)雜性,我將它的實(shí)現(xiàn)作為一個(gè)練習(xí)留給讀者。

排序過(guò)濾器的主要特征在于,他們不增加或者減少模型的可見(jiàn)元素個(gè)數(shù),因此, getSize() 將委托給被過(guò)濾的模型。他們通常將不改變數(shù)據(jù)元素,而只是按照某種替代順序解釋數(shù)據(jù)的索引。

排除Swing模型過(guò)濾

最后兩種類(lèi)型的過(guò)濾器非常相似,但是,擁有完全不同的目的。排除過(guò)濾器與包含過(guò)濾器都允許對(duì)模型的數(shù)據(jù)元素進(jìn)行限制或者補(bǔ)充額外的元素。

排除過(guò)濾器使模型中的某些元素看似不存在。在只有單一數(shù)據(jù)源可用、并且實(shí)現(xiàn)方案只要求顯示數(shù)據(jù)的一個(gè)子集的情況下,這些過(guò)濾器相當(dāng)有效。

關(guān)于典型的排除過(guò)濾器的示例,請(qǐng)參考 TerritoryListModelFilter.java。該示例給出了一個(gè)銷(xiāo)售區(qū)域列表,其中每個(gè)區(qū)域都與一個(gè)銷(xiāo)售人員相關(guān)聯(lián)。當(dāng)選定一個(gè)銷(xiāo)售人員的姓名時(shí),過(guò)濾器只顯示與該銷(xiāo)售人員相關(guān)聯(lián)的那些區(qū)域。

這個(gè)示例的優(yōu)點(diǎn)非常明顯:如果不進(jìn)行過(guò)濾,則每次選定一個(gè)不同的銷(xiāo)售人員都需要重新加載數(shù)據(jù)模型,或者在高速緩存中保存大量的模型實(shí)例。過(guò)濾器甚至允許兩個(gè)不同的組件用兩種不同的解釋方案查看同一個(gè)基本模型。

包含過(guò)濾器

包含過(guò)濾器盡管不像排除過(guò)濾器那樣廣泛適用,但它們可用來(lái)向模型中添加信息。由于這種類(lèi)型的過(guò)濾器可用于進(jìn)行總計(jì)或者小計(jì),這些過(guò)濾器的最佳用途是報(bào)表應(yīng)用程序。

執(zhí)行總計(jì)操作的過(guò)濾器創(chuàng)建一個(gè)虛擬元素,并將其顯示在列表模型的尾部。為了實(shí)現(xiàn)這一功能,過(guò)濾器將模型大小的值加 1,并將對(duì)除最后一個(gè)元素之外的所有元素的請(qǐng)求發(fā)送至代理。 SalesTotalListModelFilter.java 中的示例假定列表數(shù)據(jù)是不可變的;過(guò)濾器將列表數(shù)據(jù)事件忽略。這里再一次用到前一個(gè)示例中的 TerritoryListModel。

小結(jié)

這些示例已經(jīng)顯示了Swing模型過(guò)濾的某些應(yīng)用。過(guò)濾是一種應(yīng)用相當(dāng)廣泛的概念,遠(yuǎn)遠(yuǎn)不止本文這些相對(duì)比較簡(jiǎn)單的應(yīng)用。當(dāng)您開(kāi)始實(shí)現(xiàn)過(guò)濾器時(shí),請(qǐng)記住下列幾點(diǎn):

過(guò)濾可以向不同組件提供不同的視圖,并且可以減少應(yīng)用程序必須支持的完整模型實(shí)例的個(gè)數(shù)。

過(guò)濾可以應(yīng)用于 Swing 支持的其他模型,包括選擇模型。

您可以為處理可變模型或者動(dòng)態(tài)模型構(gòu)造非常復(fù)雜的過(guò)濾方案。為了實(shí)現(xiàn)這一點(diǎn),可以用一個(gè)過(guò)濾器來(lái)處理由該代理模型傳遞的事件。

您可以無(wú)限地嵌套(或疊用)過(guò)濾器,但是,當(dāng)每次修改或者查詢模型時(shí),每個(gè)過(guò)濾層都會(huì)增加一些額外的處理負(fù)擔(dān)。


分享名稱(chēng):Swing模型過(guò)濾技術(shù)詳解
網(wǎng)頁(yè)鏈接:http://m.5511xx.com/article/codgoed.html