徐洪位
摘要:在進(jìn)行JAVA程序設(shè)計(jì)時(shí),窗口是常用的一個(gè)對(duì)象,窗口對(duì)象是沒(méi)有邊框和菜單欄的頂級(jí)窗口。窗口的默認(rèn)布局是邊界布局。一個(gè)窗口必須有一個(gè)框架、對(duì)話(huà)框或另一個(gè)定義為它的所有者的窗口。該文對(duì)Window類(lèi)的使用和設(shè)置進(jìn)行了簡(jiǎn)要的介紹。
關(guān)鍵詞:Window;Illegal Argument Exception;Graphics Configuration
中圖分類(lèi)號(hào):TP316 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2018)18-0069-02
1 概述
在多屏幕環(huán)境中,您可以通過(guò)使用窗口(窗口、GraphicsConfiguration)創(chuàng)建窗口,在不同的屏幕設(shè)備上創(chuàng)建一個(gè)窗口。GraphicsConfiguration對(duì)象是目標(biāo)屏幕設(shè)備的GraphicsConfiguration對(duì)象之一。
在虛擬設(shè)備多屏幕環(huán)境中,桌面區(qū)域可以跨越多個(gè)物理屏幕設(shè)備,所有配置的邊界都相對(duì)于虛擬設(shè)備坐標(biāo)系統(tǒng)。虛擬坐標(biāo)系統(tǒng)的原點(diǎn)位于主物理屏幕的左上角。根據(jù)虛擬設(shè)備中主屏幕的位置,可能會(huì)出現(xiàn)負(fù)坐標(biāo),如圖1所示:
其中Virtual device:虛擬設(shè)備;physical screen:物理屏幕;primary physical screen:主物理屏幕。
2 使用方法簡(jiǎn)介
當(dāng)在一個(gè)環(huán)境中調(diào)用setLocation方法時(shí),必須將一個(gè)虛擬坐標(biāo)傳遞給這個(gè)方法。類(lèi)似地,在窗口中調(diào)用getLocationOnScreen將返回虛擬設(shè)備的坐標(biāo)。調(diào)用GraphicsConfiguration的getBounds方法,在虛擬坐標(biāo)系統(tǒng)中找到它的原點(diǎn)。
下面的代碼將窗口的位置設(shè)置為(10,10)相對(duì)于相應(yīng)圖形配置的物理屏幕的原點(diǎn)。如果沒(méi)有考慮到GraphicsConfiguration的邊界,窗口位置將設(shè)置為(10,10)相對(duì)于虛擬坐標(biāo)系統(tǒng),并且會(huì)出現(xiàn)在主物理屏幕上,這可能與指定圖形配置的物理屏幕不同。
Window w = new Window(Window owner, GraphicsConfiguration gc);
Rectangle bounds = gc.getBounds();
w.setLocation(10 + bounds.x, 10 + bounds.y);
注意:頂層窗口的位置和大小(包括窗口、框架和對(duì)話(huà)框)都在桌面窗口管理系統(tǒng)的控制之下。調(diào)用setLocation、setSize和setBounds是被轉(zhuǎn)發(fā)到窗口管理系統(tǒng)的請(qǐng)求(而不是指令)。但是,在某些情況下,窗口管理系統(tǒng)可能會(huì)忽略這些請(qǐng)求,或者修改所請(qǐng)求的幾何形狀,以使窗口更接近于桌面設(shè)置。
由于事件處理的異步性質(zhì),getBounds、getLocation、getLocationOnScreen和getSize返回的結(jié)果可能無(wú)法反映屏幕上的窗口的實(shí)際幾何形狀,直到最后一個(gè)請(qǐng)求被處理。在處理后續(xù)請(qǐng)求的過(guò)程中,這些值可能會(huì)相應(yīng)地發(fā)生變化,而窗口管理系統(tǒng)則滿(mǎn)足這些請(qǐng)求。
一個(gè)應(yīng)用程序可以任意設(shè)置一個(gè)看不見(jiàn)的窗口的大小和位置,但是窗口管理系統(tǒng)可能隨后改變它的大小和/或窗口可見(jiàn)的位置。將生成一個(gè)或多個(gè)組件,以指示新的幾何圖形。
Windows能夠生成下列窗口事件:窗口打開(kāi),窗口關(guān)閉,窗口集中,窗口集中。
3 構(gòu)造器使用概述
3.1 Window
格式:public Window(Frame owner);
構(gòu)造一個(gè)新的、最初看不見(jiàn)的窗口,其中指定的框架作為它的所有者。除非它本身在屏幕上顯示,否則該窗口將不能被聚焦。
如果有一個(gè)安全管理器,它被調(diào)用時(shí)將來(lái)檢查AWTPermission(“showwindowwithoutarningbanner”)。如果這個(gè)檢查失敗了,那么就會(huì)創(chuàng)建一個(gè)警告標(biāo)志。
參數(shù):如果窗口沒(méi)有所有者,則該框架作為本身所有或null。
異常拋出:
IllegalArgumentException:如果所有者的GraphicsConfiguration不是來(lái)自屏幕設(shè)備;
HeadlessException:當(dāng)GraphicsEnvironment.isHeadless返回true時(shí)產(chǎn)生異常。
3.2 Window
格式:public Window(Window owner)
構(gòu)造一種新的、最初看不見(jiàn)的窗口,它的所有者是指定的窗口。除非它的最近的擁有框架或?qū)υ?huà)框顯示在屏幕上,否則這個(gè)窗口將不會(huì)成為焦點(diǎn)。
使用方法與第一個(gè)構(gòu)造器相同。
3.3 Window
格式:public Window(Window owner,GraphicsConfiguration gc)
構(gòu)造一個(gè)新的,最初不見(jiàn)的窗口,有指定的所有者窗口和一個(gè)屏幕設(shè)備的圖形配置。除非它最近的擁有框架或?qū)υ?huà)框顯示在屏幕上,否則該窗口將無(wú)法集中。
如果有一個(gè)安全管理器設(shè)置,它將調(diào)用檢查AWTPermission(“showwindowwithoutarningbanner”)。如果這個(gè)檢查失敗了,那么就會(huì)創(chuàng)建一個(gè)警告標(biāo)志。
參數(shù):
owner—如果此窗口沒(méi)有所有者,則該窗口作為所有者或null。
gc-目標(biāo)屏幕設(shè)備的圖形配置;如果gc為空,則假定系統(tǒng)默認(rèn)為GraphicsConfiguration。
異常拋出:
IllegalArgumentException:如果gc不是來(lái)自屏幕設(shè)備;
HeadlessException -當(dāng)GraphicsEnvironment.isHeadless()返回true值。
4 主要方法使用說(shuō)明
4.1 getIconImages
格式:public List
返回要顯示為這個(gè)窗口的圖標(biāo)的圖像序列。
該方法返回一個(gè)內(nèi)部存儲(chǔ)列表的副本,因此返回的對(duì)象上的所有操作都不會(huì)影響窗口的行為。
返回值:如果該窗口沒(méi)有圖標(biāo)圖像,則為該窗口的圖標(biāo)圖像的副本或空列表。
4.2 setIconImages
格式:public void setIconImages(List<? extends Image> icons)
設(shè)置要顯示為該窗口的圖標(biāo)的圖像序列。隨后對(duì)getIconImages的調(diào)用將總是返回一個(gè)圖標(biāo)列表的副本。
根據(jù)平臺(tái)功能,不同維度的一個(gè)或多個(gè)圖像將被用作窗口的圖標(biāo)。從一開(kāi)始,這些圖標(biāo)就會(huì)被掃描到最合適的尺寸。如果列表包含相同大小的多個(gè)圖像,則將使用第一個(gè)。無(wú)主窗口,沒(méi)有指定的圖標(biāo)使用平臺(tái)默認(rèn)圖標(biāo)。所有者窗口的圖標(biāo)可以從所有者繼承,除非顯式地重寫(xiě)。將圖標(biāo)設(shè)置為null或空列表將恢復(fù)默認(rèn)行為。
注意:本機(jī)窗口系統(tǒng)可以根據(jù)上下文(例如窗口裝飾、窗口列表、任務(wù)欄等)使用不同維度的不同圖像來(lái)表示窗口。它們也可以只對(duì)所有上下文使用單個(gè)圖像,或者根本不使用圖像。
參數(shù):icons-顯示的圖標(biāo)圖像列表。
4.3 setIconImage
格式:public void setIconImage(Image image)
設(shè)置要顯示為該窗口的圖標(biāo)的圖像。這個(gè)方法可以代替setIconImages()來(lái)指定單個(gè)圖像作為窗口的圖標(biāo)。
語(yǔ)句:setIconImage(image) 等價(jià)于:
ArrayList
imageList.add(image);
setIconImages(imageList);
注意:本機(jī)窗口系統(tǒng)可以根據(jù)上下文(例如窗口裝飾、窗口列表、任務(wù)欄等)使用不同維度的不同圖像來(lái)表示窗口。它們也可以只對(duì)所有上下文使用單個(gè)圖像,或者根本不使用圖像。
參數(shù): image -要顯示的圖標(biāo)圖像。
4.4 addNotify
格式:public void addNotify()
通過(guò)創(chuàng)建與本機(jī)屏幕資源的連接,使此窗口可顯示。這個(gè)方法是由工具箱內(nèi)部調(diào)用的,不應(yīng)該被程序直接調(diào)用。
4.5 removeNotify
格式:public void removeNotify()
通過(guò)刪除與本機(jī)屏幕資源的連接,使此容器無(wú)法顯示。使一個(gè)容器無(wú)法顯示,將使所有的孩子都無(wú)法顯示。這個(gè)方法是由內(nèi)部工具箱調(diào)用的,不應(yīng)該被程序直接調(diào)用。
4.6 toBack
格式:public void toBack()
如果這個(gè)窗口是可見(jiàn)的,將這個(gè)窗口發(fā)送到后面,如果它是焦點(diǎn)或活動(dòng)窗口,可能會(huì)導(dǎo)致它失去焦點(diǎn)或激活。
將此窗口放置在堆棧順序的底部,并在此VM的任何其他窗口后面顯示它。這個(gè)窗口是不可見(jiàn)的。有些平臺(tái)不允許其他窗口擁有的窗口出現(xiàn)在其所有者的下方。每一次嘗試都將使這扇窗戶(hù)盡可能的低,在堆疊順序;但是,開(kāi)發(fā)人員不應(yīng)該假設(shè)這種方法會(huì)在任何情況下將這個(gè)窗口移到所有其他窗口之下。
由于本地窗口系統(tǒng)的變化,無(wú)法保證對(duì)焦點(diǎn)和活動(dòng)窗口的更改。開(kāi)發(fā)人員永遠(yuǎn)不能假定這個(gè)窗口不再是焦點(diǎn)或活動(dòng)窗口,直到這個(gè)窗口接收到WINDOW_LOST_FOCUS或window_deactive事件。在最頂部的窗口是焦點(diǎn)窗口的平臺(tái)上,這個(gè)方法可能會(huì)導(dǎo)致這個(gè)窗口失去焦點(diǎn)。在這種情況下,這個(gè)VM中的下一個(gè)最高的、可聚焦的窗口將得到焦點(diǎn)。在堆疊順序通常不會(huì)影響焦點(diǎn)窗口的平臺(tái)上,這種方法可能會(huì)使焦點(diǎn)和活動(dòng)窗口保持不變。
參考文獻(xiàn):
[1] 戰(zhàn)曉蘇, 江凌. Java 8編程參考官方教程[M]. 9版. 北京: 清華大學(xué)出版社, 2015.
[2] 陸明剛, 勞佳. Java 8實(shí)戰(zhàn)[M]. 北京: 人民郵電出版社, 2016.
[3] 劉利明, 張莉萍. JavaWeb開(kāi)發(fā)實(shí)戰(zhàn)1200例[M]. 北京: 清華大學(xué)出版社, 2011.