中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Swing核心組件有哪些

發布時間:2021-12-27 09:23:42 來源:億速云 閱讀:191 作者:小新 欄目:編程語言

這篇文章主要介紹了Swing核心組件有哪些,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

當提到比較awt組件和Swing組件的區別時, 首先被提到的就是Swing 是輕量級的(lightweight).確切的說其按鈕、框架和菜單都沒有使用本地化控制(native controls).所有組件包括渲染和事件處理都是靠純java控制的。這給我們提供了很多方法去創建真正與平臺無關的組件,而創建一個在所有平臺上外觀一致的自定義組件并非一件簡單的事,這篇文章將演示如何創建自定義組件的過程并高亮顯示重點、步驟和易犯的錯誤。

基礎部分

Swing architecture overview這篇文章提供了非常優秀的Swing結構和開發的高級概述(high-level overview)。雖然創建組件要遵循一些規則會略微有點麻煩,不過最終代碼會更容易理解。它遵循”不重復發明輪子”的原則。最初你會想要把所有的東西都集中到一個類里,包括擴展API,模型處理(狀態和通知),事務處理,布局和繪制。但是按照MVC (model-view-controller)結構將其劃分為多個類可以讓你的組件代碼更容易理解,并且從長遠來說更加容易擴展。
所有Swing核心組件的主要部分如下:

◆組件(component)類本身,他負責提供創建、修改和查詢組件狀態的API
◆模型接口和和模型接口的默認實現,它負責處理組件的業務邏輯和組件改變通知
◆UI delegate 負責處理組件布局,事件處理(鼠標和鍵盤事件)以及組件的繪制。

本文將配圖展示創建一個自定義組件,類似WINDOWS Vista Explorer 中新的 view slider。這個組件按看上去很像一個滑標嵌入一個pop-up menu。但他和常規的JSlider又有所不同,首先,它會含有關聯標簽(labels)和圖標(icon)的選項(control points),其次,若range是相鄰的,(如Small Icons和Medium Icons),能夠動態的修改圖標大小,若range是非關聯的(如Tiles-Details),滑塊只能滑動到這些選項上,不能滑動到這些選項之間的位置。

組件類:UI Delegate 裝配
自定義組件的***個類就是組件本身的API,這個API足夠簡單并且委托大部分業務邏輯給模型(參考下一章),除此之外,為了設置合適的UI delegate,你需要增加一個樣板(boilerplate)(詳細介紹請參考Enhancing Swing Applications 一文),最終,你的代碼應該是類似這樣的:

privatestaticfinalStringuiClassID="FlexiSliderUI";   publicvoidsetUI(FlexiSliderUIui){  super.setUI(ui);  }   publicvoidupdateUI(){  if(UIManager.get(getUIClassID())!=null){  setUI((FlexiSliderUI)UIManager.getUI(this));  }else{  setUI(newBasicFlexiSliderUI());  }  }   publicFlexiSliderUIgetUI(){  return(FlexiSliderUI)ui;  }   publicStringgetUIClassID(){  returnuiClassID;  }

這里需要注意的一點是:你需要提供一個可靠的UI delegate,如果當前安裝的look and feel 沒有提供特殊的UI delegate時,這個UI delegate將處理組件的繪制,布局和事件處理。


模型接口

這可能是這個組件最重要的接口了。它將從業務層面表現的你的組件功能。模型接口不要包含任何和界面繪制相關的方法(像setFont或getPreferredSize)。我們的組件將遵循LinearGradientPaint API并且定義模型為一些range序列:

publicstaticclassRange{  privatebooleanisDiscrete;   privatedoubleweight;   publicRange(booleanisDiscrete,doubleweight){  this.isDiscrete=isDiscrete;  this.weight=weight;  }   ...  }

模型中設置和查詢range的API

public void setRanges(Range... range);     public int getRangeCount();       public Range getRange(int rangeIndex);

這個模型還提供當前值對象的get和set方法:
模型接口的***一部分為增加/移除變化監聽器(ChangeListeners)的方法,他遵循Swing核心組件的model接口風格(參考BoundedRangeModel);

void addChangeListener(ChangeListener x);     void removeChangeListener(ChangeListener x);


模型實現

模型的實現類非常簡單,參考DefaultBoundedRangeModel,變化監聽器(ChangeListeners)使用EventListenerList來保存。當模型值被改變時將觸發ChangeEvent:

protectedvoidfireStateChanged(){  ChangeEventevent=newChangeEvent(this);  Object[]listeners=listenerList.getListenerList();  for(inti=listeners.length-2;i>=0;i-=2){  if(listeners[i]==ChangeListener.class){  ((ChangeListener)listeners[i+1]).stateChanged(event);  }  }  }

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Swing核心組件有哪些”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乾安县| 永和县| 巴塘县| 汨罗市| 剑河县| 嘉善县| 夏津县| 霍邱县| 德州市| 汤阴县| 颍上县| 海门市| 阿坝县| 苏州市| 武汉市| 大方县| 尼木县| 津市市| 大丰市| 理塘县| 年辖:市辖区| 安陆市| 丁青县| 桓仁| 星子县| 绥滨县| 桐庐县| 介休市| 鄂州市| 营口市| 靖西县| 鱼台县| 芷江| 和政县| 宣汉县| 巨鹿县| 休宁县| 察哈| 大悟县| 子长县| 平定县|