簡體   English   中英

JLayeredPane:深度和位置之間的功能差異是什么?

[英]JLayeredPane: what's the functional difference between depth and position?

我正在為學校Java項目開發Connect Four游戲。 我已經獲得了JLayeredPane的'how',它正如預期的那樣工作,但我並沒有完全理解某個概念背后的“原因”。

這是我的理解:

JLayeredPane是一個類似於JPanel的容器,允許您為每個組件指定深度和位置。 深度是一個整數,0表示底層,n-1表示頂層,n表示組件數。 Position是一個int(是的,一個使用整數包裝類,一個只是一個原語!),它指定了一個組件在層中的位置,0是最頂層,-1是最底層,正是ints in之間,數字越低,位置越高。 因此,單個層中的四個組件可以從最頂部到最底部排序到位置0,1,2,-1。

我的問題是,有兩個概念需要什么?

例如,我創建了三個帶有圖像的JLabel:frontBoard,backBoard和piece。 這件作品有時會在frontBoard前面,有時會在frontBoard和backBoard之間。 我們來看看第二個例子。

我可以通過以下任何一種方式獲得相同的效果:

1)我可以將backBoard設置為0層,位置0; 片斷到第1層,位置0; 和frontBoard到第2層,位置0

 or 

2)我可以將backBoard設置為0層,位置-1; 片斷到0層,位置1; 和frontBoard到0層,位置0

我已經測試了這兩種方法,但我找不到這兩種方法之間的功能差異。

任何人都可以為我揭開這個謎團的光芒嗎?

首先,在這種情況下最好的做法是查看教程,它們通常非常有用: http//download.oracle.com/javase/tutorial/uiswing/components/layeredpane.html

此外,類的javadoc本身包含了JLayeredPane工作方式的很好的解釋。

由於您已經實現了項目,因此您知道可以通過兩種不同的方式實現組件堆疊:將每個組件放在自己的層上,或者通過分配位於同一層上不同位置值的不同組件。 效果是一樣的,但您可以使用兩個不同的屬性來實現它:

  • “depth”圖層的屬性:它們被枚舉,因此深度為0的圖層是最低的圖層。 深度較高的圖層覆蓋深度較低的圖層。
  • 由於層可以包含多個組件,並且由於組件總是可以重疊,因此必須有一種方法來定義層組件的z順序:這是通過枚舉具有“位置”值的組件來實現的。 如果圖層中有n組件並且您從0開始計數,則位置必須是介於0和n-1之間的值。

現在你可以爭辯說,由於你有“位置”值,你根本不需要多個層,因為你可以簡單地通過它們的“位置”值沿z軸定位所有組件。 這是事實,沒有人阻止你這樣做。

當您意識到有一個預定義常量用於圖層的“深度”值時,可以看到多個圖層的基本原理:

  • DEFAULT_LAYER
  • PALETTE_LAYER
  • MODAL_LAYER
  • POPUP_LAYER
  • DRAG_LAYER

這些只是復雜多窗口應用程序的邏輯分組,可幫助您確保滿足某些堆疊約束:假設您要創建一個顯示在主應用程序框架頂部的模式對話框窗口。 如果使用單個圖層,則必須自己跟蹤所有可見組件的位置,並將對話框的位置設置為n。 現在添加拖放動畫,彈出菜單等,這個任務變得非常復雜。

通過使用預定義層,這種復雜性降低了。 如果你想顯示一個模態對話框窗口,你不關心主應用程序窗口的組件,只需將它放在MODAL_LAYER上就可以了:你可以確定它顯示在所有其他組件之上。

幸運的是,Swing已經為你做了所有這些事情(通過在內部使用JLayeredPane或其子類),所以你可以在JDialog上調用setVisible(boolean)或setModal(boolean),它會以你期望的方式運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM