SWT ScrolledComposite解释
就像我的一個朋友曾經(jīng)說過的那樣,SWT的ScrolledComposite是令人討厭的野獸。 在某種程度上,我同意。 這可能是為什么有太多關(guān)于如何使用此小部件的問題的原因。
但不僅是ScrolledComposite的作者受到了譴責(zé)。 當(dāng)某個軟件無法按您預(yù)期的方式工作時,則……您詛咒……并嘗試一些不同的嘗試……并以不同的方式詛咒……并向Google尋求幫助……并(希望)找到這個可愛的小文章。 哪個告訴您:RTFM! – ups,嗯,我的意思是當(dāng)然看看文檔。
而且,如果您閱讀JavaDoc,您將了解有兩種使用ScrolledComposite的方法,并查看了相應(yīng)的示例代碼。
二合一
第一種方法適用于固定大小的內(nèi)容,如果無法完全看到所包含的控件,將顯示滾動條,否則將其隱藏。
另外,如果進行了相應(yīng)的設(shè)置,則ScrolledComposite會模仿瀏覽器的工作方式。 內(nèi)容將隨著ScrolledComposite的大小而增長和縮小–直到可見區(qū)域小于指定的最小大小。 在后一種情況下,將顯示滾動條,并且內(nèi)容絕不會減少到最小大小以下。
該視頻并排顯示了不同的操作模式:
在左側(cè),當(dāng)窗口放大時內(nèi)容的大小保持不變,并且在不再需要滾動條時消失。 但是,在右側(cè),初始窗口大小小于指定的最小大小,因此會出現(xiàn)滾動條。 隨著窗口變大,內(nèi)容也隨窗口增長。
滾動固定內(nèi)容
設(shè)置ScrolledComposite以顯示固定內(nèi)容非常簡單:
scrolledComposite = new ScrolledComposite( parent, SWT.H_SCROLL | SWT.V_SCROLL ); Label label = new Label( scrolledComposite, SWT.NONE ); label.setBackground( display.getSystemColor( SWT.COLOR_DARK_GREEN ) ); label.setSize( 400, 400 ); scrolledComposite.setContent( label );請注意,您需要顯式指定H_SCROLL和V_SCROLL樣式標(biāo)志。 否則,將不會創(chuàng)建任何滾動條,并且ScrolledComposite幾乎沒有用( 稍后會在滾動條上更多介紹 )。
代碼段的另一個值得注意的部分是在其中創(chuàng)建內(nèi)容的地方-這里是一個400 x 400像素的綠色標(biāo)簽。 內(nèi)容的父級必須是ScrolledComposite本身。 如果沒有,您會看到有趣的結(jié)果。 最后,必須告知ScrolledComposite應(yīng)該使用setContent()管理的內(nèi)容。
該示例演示了最簡單的情況,其中內(nèi)容是單個控件。 但是,如果要滾動的內(nèi)容包含多個控件,則需要將它們包裝到具有適當(dāng)布局的Composite中,如聯(lián)系詳細信息示例中所示。
在此上下文中,固定大小的內(nèi)容并不表示該內(nèi)容必須或不能更改其大小。 如果發(fā)生這種情況,則ScrolledComposite將適應(yīng)新的大小,并相應(yīng)地顯示或隱藏滾動條。 但是,如果調(diào)整ScrolledComposite的大小,則內(nèi)容不會更改其大小。
滾動擴展內(nèi)容
通過添加幾行,可以擴展上述代碼片段以擴展其內(nèi)容:
scrolledComposite.setExpandHorizontal( true ); scrolledComposite.setExpandVertical( true ); scrolledComposite.setMinSize( 250, 250 );之后,ScrolledComposite會在調(diào)整大小時擴展內(nèi)容,并且僅在滾動條的大小減小到小于最小大小時才顯示滾動條。 SWT API提供了進一步的方法來設(shè)置最小大小。 通過setMinWidth()和setMinHeight()或setMinSize(Point)分別確定最小寬度和高度。
擴展內(nèi)容時,將最小大小設(shè)置為零(默認值)是合法的。 結(jié)果,內(nèi)容將縮小而沒有下限,并且永遠不會顯示滾動條。
這是ScrolledComposite的兩種基本模式:管理固定大小的內(nèi)容或擴展和減少內(nèi)容。
僅垂直滾動
我遇到的另一個用例是有一個未知長度的項目清單。 考慮一下冗長的聯(lián)系方式表單,其中包含多行,每行包括一個標(biāo)簽和一個輸入字段。 每行的寬度占用的空間盡可能多,但是如果行數(shù)超過可用高度,則該數(shù)字應(yīng)該是可滾動的。
稍作調(diào)整,即可將上面顯示的擴展ScrolledComposite擴展為僅垂直滾動。 此處的關(guān)鍵是動態(tài)設(shè)置最小大小。 每當(dāng)ScrolledComposite更改其大小時,內(nèi)容的最小寬度將設(shè)置為ScrolledComposite的可用寬度。
實現(xiàn)所描述行為的代碼非常簡單:
scrollComposite.addListener( SWT.Resize, event -> {int width = scrollComposite.getClientArea().width;scrollComposite.setMinSize( parent.computeSize( width, SWT.DEFAULT ) ); } ); 調(diào)整大小的偵聽器使用getClientArea()查詢ScrolledComposite的可用空間
并根據(jù)給定的客戶區(qū)域?qū)挾扔嬎銉?nèi)容的必要大小。 最后,將結(jié)果大小設(shè)置為ScrolledComposite的最小大小。
在此示例中,內(nèi)容的外觀由兩列布局控制。 標(biāo)簽列的寬度足以顯示最長的標(biāo)簽,而輸入字段列則使用剩余的寬度。 每行依次使用最佳高度(即顯示單行輸入字段所需的高度)。
即使我還沒有看到實際的用例,但這種方法在水平擴展時也可以使用。
計算ScrolledComposite的首選大小
沒有比看到應(yīng)用程序設(shè)計時考慮到單個屏幕分辨率,字體大小或配色方案(或全部)更令人難過的了。 為避免這種情況,聯(lián)系人詳細信息表單使用自適應(yīng)策略來計算其初始大小。
由于內(nèi)容由重復(fù)項組成(此處標(biāo)記為輸入字段),因此將單個項目的大小作為度量單位。 這里的項目數(shù)是從證據(jù)中獲得的數(shù)字,但在其他情況下,也可能是從數(shù)據(jù)源獲得的(有限)行數(shù)。
公式本身很簡單:
numberOfItems = 10 initialHeight = numberOfItems * ( itemHeight + spacing )進一步的改進將是對照屏幕尺寸檢查最終的高度,并在必要時減小其高度。
生成的布局可在不同平臺,屏幕分辨率和字體設(shè)置之間很好地縮放。 如果這引起了您的興趣,您可能還想閱讀Eclipse和SWT的響應(yīng)式UI 。
垂直和水平滾動條
要掌握滾動條,請分別使用getVerticalBar()和getHorizo??ntalBar()。 如片段中所示,需要指定V_SCROLL和H_SCROLL樣式標(biāo)志才能創(chuàng)建垂直和/或水平滾動條。 如果省略了相應(yīng)的樣式標(biāo)志,則不會創(chuàng)建任何滾動條,并且getVerticalBar()或getHorizo??ntalBar()將返回null。
但是,可以隨時顯示或隱藏,啟用或禁用現(xiàn)有滾動條。 默認情況下,ScrolledComposite僅在必要時顯示滾動條,但可以使用setAlwaysShowScrollBars()將此行為更改為始終顯示滾動條。 因此,通常需要同時創(chuàng)建兩個滾動條,并讓ScrolledComposite決定何時顯示或隱藏單個條。
通常,請注意,滾動條由ScrolledComposite管理。 因此,查詢它們的狀態(tài)是安全的,但是操縱屬性很可能會干擾ScrolledComposite的事物視圖。
若要更改滾動條的位置以使內(nèi)容的某些部分可見,請使用下面討論的指定方法。
上述唯一的例外可能是滾動條的啟用狀態(tài)。 如果確實希望這樣做,則可以安全地調(diào)用setEnabled()。
滾動到視圖
ScrolledComposite有幾種更改滾動條位置的方法。 最基本的是setOrigin()。 滾動內(nèi)容控件,以使內(nèi)容中的指定點位于左上角。 所需位置可以指定為單獨的x和y坐標(biāo),也可以指定為點。 因此,有一個getOrigin()方法可返回當(dāng)前顯示在左上角的點。
為了給客戶節(jié)省一些坐標(biāo)映射,有一個showControl(),它建立在setOrigin()上并滾動內(nèi)容以便可見給定的控件。
如果焦點控件始終可見,則可以通過setShowFocusedControl()建議ScrolledComposite自動將焦點控件滾動到視圖中。
總結(jié)SWT ScrolledComposite
實際上,ScrolledComposite并不是SWT集合中最直觀的小部件,我希望這里介紹的食譜將有助于更好地與之相處。 這里討論的用例是到目前為止我所遇到的用例。 但是,我想知道進一步的用途,如果您想分享您的意見,請發(fā)表評論。
- 所顯示的摘錄是準(zhǔn)備運行的小型示例程序的摘錄,可以在這里找到: https : //gist.github.com/rherrmann/b1a2a633cd4c9b607fe7
最后但并非最不重要的一點是,我想指出的是,此處顯示的所有概念和代碼不僅適用于SWT,而且在具有Eclipse RAP的瀏覽器中同樣運行良好。 您甚至可以使用此RAP在線演示更改各種標(biāo)志和屬性,并立即查看其效果。
翻譯自: https://www.javacodegeeks.com/2016/03/swt-scrolledcomposite-explained.html
總結(jié)
以上是生活随笔為你收集整理的SWT ScrolledComposite解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 荣耀 Magic6 Pro 手机爆料:有
- 下一篇: 使用cglib创建代理对象