?? s02.htm
字號:
contentPane.add(b3);<br> contentPane.add(b4);<br> }<br> }</p> <p> 這個小應(yīng)用程序把內(nèi)容窗格的布局管理器設(shè)置為null,以便這些按鈕可以顯式地定位和確定大小,使這些按鈕樸素重疊。然后,這個小應(yīng)用程序創(chuàng)建按鈕,設(shè)置按鈕的邊界并把每個按鈕添加到內(nèi)容窗格中。<br> 即使輕量按鈕在重量按鈕之前添加到內(nèi)容窗格中,輕量按鈕也仍在重量按鈕下顯示。因?yàn)檩p量組件的層序與它們所在的重量容器的層序相同,所以輕量按鈕和它們的容器的層序相同。輕量按鈕的容器就是小應(yīng)用程序的內(nèi)容窗格。<br> 注意 第一個添加到內(nèi)容窗格的輕量按鈕在其他輕量按鈕之上顯示。同樣,第一個添加到內(nèi)容窗格的重量按鈕在其他重量按鈕之上顯示。<br> <a href="s02_t06.htm" target="_blank">圖2-6</a>所示的小應(yīng)用程序強(qiáng)調(diào)了這樣一個事實(shí):輕量組件的層序與它們的重量容器的層序相同。這個小應(yīng)用程序幾乎與圖2-5所示的小應(yīng)用程序一樣,然而,圖2-6所示的小應(yīng)用程序把三個輕量按鈕放在一個重量面板中。然后遭到把該面板添加到內(nèi)容窗格中,使這個重量面板在第二個重量按鈕之后 ,在第三個重量按鈕之前。結(jié)果,輕量按鈕具有與它們所在的面板相同的層序,它們在第二個重量按鈕之下,第三個重量按鈕之上顯示。<br> 例2-7列出了圖2-6所示的小應(yīng)用程序的代碼。</p> <p align="center"><b>例2-7 控制輕量按鈕的層序</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> Button b1, b2, b3, b4;<br> JButton jb1, jb2, jb3;</p> <p> public void init() {<br> Container contentPane = getContentPane();<br> Panel p = new BorderedPanel();</p> <p> // set layout managers for content pane and panel<br> // to null so their components can be explicitly<br> // positioned and sized<br> contentPane.setLayout(null);<br> p.setLayout(null);</p> <p> // create heavyweight AWT buttons<br> b1 = new Button("Heavyweight Button #1");<br> b2 = new Button("Heavyweight Button #2");<br> b3 = new Button("Heavyweight Button #3");<br> b4 = new Button("Heavyweight Button #4");</p> <p> // create lightweight Swing buttons<br> jb1 = new JButton("Swing Button #1");<br> jb2 = new JButton("Swing Button #2");<br> jb3 = new JButton("Swing Button #3");</p> <p> // set bounds for heavyweights<br> b1.setBounds(10, 10, 150, 25);<br> b2.setBounds(110, 25, 150, 25);<br> b3.setBounds(210, 40, 150, 25);<br> b4.setBounds(310, 55, 150, 25);</p> <p> // set bounds for lightweights<br> jb1.setBounds(5, 5, 150, 65);<br> jb2.setBounds(20, 45, 150, 65);<br> jb3.setBounds(35, 85, 150, 65);</p> <p> // set bounds for panel and add lightweights<br> p.setBounds(85, 15, 195, 155);<br> p.add(jb1);<br> p.add(jb2);<br> p.add(jb3);</p> <p> // add AWT buttons and panel to content pane<br> contentPane.add(b1);<br> contentPane.add(b2);<br> contentPane.add(p);<br> contentPane.add(b3);<br> contentPane.add(b4);<br> }<br> }<br> class BorderedPanel extends Panel {<br> public void paint(Graphics g) {<br> Dimension size = getSize();</p> <p> g.setColor(Color.black);<br> g.drawRect(0,0,size.width-1,size.height-1);<br> super.paint(g); // paint lightweights<br> }<br> }</p> <p> 例2-7的小應(yīng)用程序?qū)崿F(xiàn)java.awt.Panel類的一個擴(kuò)展(BorderedPanel),BorderedPanel在面板的外面畫了一個黑邊框,以使面板可見。<br> 另外還要注意,BorderedPanel類調(diào)用super.paint()。無論何時擴(kuò)展了一個容口并重載了它的paint方法,都必須顯式地調(diào)用super.paint(),這樣,容器中的輕量組件才能重新繪制(注:有關(guān)輕量組件的更多信息,請參見《Graphic Java》第1卷)。如果沒有調(diào)用super.paint(),則不會重新繪制面板中的輕量Swing按鈕。 </p> <p> <b><a name="2.3.2"></a>2.3.2 Swing彈出式菜單</b></p> <p> 缺省時,Swing彈出式菜單是輕量組件(注:這是一種簡化的說法,但適用于此處的討論。完整的介紹請參見10.8節(jié)“JPopupMenu”)。如果輕量彈出式菜單與重量組件重疊,則彈出式菜單將在該重量組件下面顯示。如圖2-7小應(yīng)用程序所示。<br> 有些Swing組件使用彈出式菜單。Swing菜單組件就是一種使用彈出式菜單的組件,它在一個菜單被激活時,顯示一個彈出式菜單。缺省時,如果一個與某個菜單相關(guān)聯(lián)的彈出式菜單完全處在彈出式菜單所在的窗口呂,則彈出式菜單使用輕量組件。<a href="s02_t07.htm" target="_blank">圖2-7</a>所示的小應(yīng)用程序中與File菜單相關(guān)聯(lián)的彈出式菜單是一個輕量組件,所以它在重量組件AWT按鈕的下面顯示。<br> 例2-8列出了圖2-7所示的小應(yīng)用程序的代碼。</p> <p align="center"><b>例2-8 在重量組件下面顯示的輕量彈出式菜單</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> public void init() {<br> Container contentPane = getContentPane();<br> JMenuBar menubar = new JMenuBar();<br> JMenu menu = new JMenu("File");</p> <p> menu.add("New ...");<br> menu.add("Open ...");<br> menu.add("Save As ...");<br> menu.add("Save");<br> menu.add("Exit");</p> <p> contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));<br> contentPane.add(new Button("An AWT Button ............"));</p> <p> menubar.add(menu);<br> setJMenuBar(menubar);<br> }<br> }</p> <p> 這個小應(yīng)用程序創(chuàng)建了一個菜單條、一個AWT按鈕和一個菜單。把菜單項(xiàng)添加到菜單中,再把菜單添加到菜單條中,按鈕則被添加到小應(yīng)用程序的內(nèi)容窗格中。最后,調(diào)用JApplet.setJMenuBar(),把菜單條添加到小應(yīng)用程序中。<br> 幸運(yùn)的是,Swing提供了一個機(jī)制,它迫使彈出式菜單是重量組件,這樣,它們就不會在重量組件下面彈出來。JPopupMenu類提供了一個static方法,該方法可決定彈出式菜單是重量的還是輕量的(注:某些彈出式菜單即可以指定為輕量的,也可以指定為重量的。)<br> JPopupMenu.setDefaultLightWeightPopupEnabled()以一個boolean值為參數(shù),這個值指出是把彈出式菜單實(shí)例化為輕量的還是把彈出式菜單實(shí)例化為重量的,調(diào)用setDefaultLightWeightPopupEnabled()時,如果這個boolean值為true,則創(chuàng)建的彈出式菜單是輕量的,如果這個boolean值為false,則創(chuàng)建的彈出式菜單是重量的(注:這也是簡化的說法,但同樣適用于這里的討論)。<br> <a href="s02_t08.htm" target="_blank">圖2-8</a>所示的小應(yīng)用程序除了在菜單條被實(shí)例化之前調(diào)用了JPopupMenu.setDefaultLightWeightPopupEnabled(false)以外,其余部分都與圖2-7所示的小應(yīng)用程序相同。<br> 例2-9列出了圖2-8所示的小應(yīng)用程序的代碼</p> <p align="center"><b>例2-9 使用重量彈出式菜單</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> public void init() {<br> JPopupMenu.setDefaultLightWeightPopupEnabled(false);</p> <p> Container contentPane = getContentPane();<br> JMenuBar menubar = new JMenuBar();<br> JMenu menu = new JMenu("File");</p> <p> menu.add("New ...");<br> menu.add("Open ...");<br> menu.add("Save As ...");<br> menu.add("Save");<br> menu.add("Exit");</p> <p> contentPane.setLayout(new FlowLayout(FlowLayout.LEFT));<br> contentPane.add(new Button("An AWT Button ............"));</p> <p> menubar.add(menu);<br> setJMenuBar(menubar);<br> }<br> }</p> <p> <b><a name="2.3.3"></a>2.3.3 滾動</b></p> <p> 把重量組件和輕量組件混合使用時所要關(guān)心的另一個問題是滾動。<br> Swing提供了一個替代AWT重量滾動窗格的輕量組件——JScrollPane組件。由于JScrollPane是輕量的,所以任何添加到JScrollPane實(shí)例中的重量組件都將在這個滾動窗格之上顯示。如果重量組件滾動超出了JScrollPane實(shí)例的邊框,則它就不能正確地顯示了。<br> <a href="s02_t09.htm" target="_blank">圖2-9</a>所示的小應(yīng)用程序說明了把一個重量組件添加到JScrollPane實(shí)例中并滾動重量組件使其超出滾動窗格邊框的情況。<br> 圖2-9中上圖顯示了這個小應(yīng)用程序剛啟動時的樣子,圖2-9中下圖顯示了滾動窗格滾動后,這個小應(yīng)用程序的樣子。注意,在這兩種情況下,AWT按鈕都沒有能夠正確地顯示。<br> 例2-10列出了圖2-9所示的小應(yīng)用程序的代碼。</p> <p align="center"><b>例2-10用JScrollPane滾動重量組件</b></p> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;</p> <p> public class Test extends JApplet {<br> public void init() {<br> JPanel panel = new JPanel();</p> <p> panel.add(new JButton("Swing Button ..."));<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -