📄 s02.htm
字号:
contentPane.add(b3);<br> contentPane.add(b4);<br> }<br> }</p> <p> 这个小应用程序把内容窗格的布局管理器设置为null,以便这些按钮可以显式地定位和确定大小,使这些按钮朴素重叠。然后,这个小应用程序创建按钮,设置按钮的边界并把每个按钮添加到内容窗格中。<br> 即使轻量按钮在重量按钮之前添加到内容窗格中,轻量按钮也仍在重量按钮下显示。因为轻量组件的层序与它们所在的重量容器的层序相同,所以轻量按钮和它们的容器的层序相同。轻量按钮的容器就是小应用程序的内容窗格。<br> 注意 第一个添加到内容窗格的轻量按钮在其他轻量按钮之上显示。同样,第一个添加到内容窗格的重量按钮在其他重量按钮之上显示。<br> <a href="s02_t06.htm" target="_blank">图2-6</a>所示的小应用程序强调了这样一个事实:轻量组件的层序与它们的重量容器的层序相同。这个小应用程序几乎与图2-5所示的小应用程序一样,然而,图2-6所示的小应用程序把三个轻量按钮放在一个重量面板中。然后遭到把该面板添加到内容窗格中,使这个重量面板在第二个重量按钮之后 ,在第三个重量按钮之前。结果,轻量按钮具有与它们所在的面板相同的层序,它们在第二个重量按钮之下,第三个重量按钮之上显示。<br> 例2-7列出了图2-6所示的小应用程序的代码。</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的小应用程序实现java.awt.Panel类的一个扩展(BorderedPanel),BorderedPanel在面板的外面画了一个黑边框,以使面板可见。<br> 另外还要注意,BorderedPanel类调用super.paint()。无论何时扩展了一个容口并重载了它的paint方法,都必须显式地调用super.paint(),这样,容器中的轻量组件才能重新绘制(注:有关轻量组件的更多信息,请参见《Graphic Java》第1卷)。如果没有调用super.paint(),则不会重新绘制面板中的轻量Swing按钮。 </p> <p> <b><a name="2.3.2"></a>2.3.2 Swing弹出式菜单</b></p> <p> 缺省时,Swing弹出式菜单是轻量组件(注:这是一种简化的说法,但适用于此处的讨论。完整的介绍请参见10.8节“JPopupMenu”)。如果轻量弹出式菜单与重量组件重叠,则弹出式菜单将在该重量组件下面显示。如图2-7小应用程序所示。<br> 有些Swing组件使用弹出式菜单。Swing菜单组件就是一种使用弹出式菜单的组件,它在一个菜单被激活时,显示一个弹出式菜单。缺省时,如果一个与某个菜单相关联的弹出式菜单完全处在弹出式菜单所在的窗口吕,则弹出式菜单使用轻量组件。<a href="s02_t07.htm" target="_blank">图2-7</a>所示的小应用程序中与File菜单相关联的弹出式菜单是一个轻量组件,所以它在重量组件AWT按钮的下面显示。<br> 例2-8列出了图2-7所示的小应用程序的代码。</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> 这个小应用程序创建了一个菜单条、一个AWT按钮和一个菜单。把菜单项添加到菜单中,再把菜单添加到菜单条中,按钮则被添加到小应用程序的内容窗格中。最后,调用JApplet.setJMenuBar(),把菜单条添加到小应用程序中。<br> 幸运的是,Swing提供了一个机制,它迫使弹出式菜单是重量组件,这样,它们就不会在重量组件下面弹出来。JPopupMenu类提供了一个static方法,该方法可决定弹出式菜单是重量的还是轻量的(注:某些弹出式菜单即可以指定为轻量的,也可以指定为重量的。)<br> JPopupMenu.setDefaultLightWeightPopupEnabled()以一个boolean值为参数,这个值指出是把弹出式菜单实例化为轻量的还是把弹出式菜单实例化为重量的,调用setDefaultLightWeightPopupEnabled()时,如果这个boolean值为true,则创建的弹出式菜单是轻量的,如果这个boolean值为false,则创建的弹出式菜单是重量的(注:这也是简化的说法,但同样适用于这里的讨论)。<br> <a href="s02_t08.htm" target="_blank">图2-8</a>所示的小应用程序除了在菜单条被实例化之前调用了JPopupMenu.setDefaultLightWeightPopupEnabled(false)以外,其余部分都与图2-7所示的小应用程序相同。<br> 例2-9列出了图2-8所示的小应用程序的代码</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> 把重量组件和轻量组件混合使用时所要关心的另一个问题是滚动。<br> Swing提供了一个替代AWT重量滚动窗格的轻量组件——JScrollPane组件。由于JScrollPane是轻量的,所以任何添加到JScrollPane实例中的重量组件都将在这个滚动窗格之上显示。如果重量组件滚动超出了JScrollPane实例的边框,则它就不能正确地显示了。<br> <a href="s02_t09.htm" target="_blank">图2-9</a>所示的小应用程序说明了把一个重量组件添加到JScrollPane实例中并滚动重量组件使其超出滚动窗格边框的情况。<br> 图2-9中上图显示了这个小应用程序刚启动时的样子,图2-9中下图显示了滚动窗格滚动后,这个小应用程序的样子。注意,在这两种情况下,AWT按钮都没有能够正确地显示。<br> 例2-10列出了图2-9所示的小应用程序的代码。</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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -