📄 s04.htm
字号:
<SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up.js"></SCRIPT><SCRIPT LANGUAGE="JavaScript" SRC="/-fs0/sys/pop-up-all.js"></SCRIPT><html><head><title>易都网--Java 2 图形设计卷Ⅱ:SWING</title><LINK rel="stylesheet" href="../../../_public/javaa.css"><meta http-equiv="Content-Type" content="text/html; charset=GBK"><script language="JavaScript" src="../../../_public/javaa.js"></script><meta name="keywords" content="Java,JSP,ASP,PHP,J2EE,EJB,JavaScript,C/C++,ASM,CSS,HTML,XML,网络安全,MySQL,ACCESS"></head><body bgcolor="#FFFFFF"><table border=0 cellpadding=0 cellspacing=0 width="100%"> <tbody> <script language="javascript">print2()</script> <tr> <td width="100%"> <table bgcolor=#EEEEEE border=0 cellpadding=3 cellspacing=0 width="100%"> <tbody> <tr> <td class=f1 id=thetd width="100%"> <p>[<a href="index.html" target="_self">目录</a>][<a href="s03.htm">上一页</a>][<a href="s05.htm">下一页</a>]</p> <p align="center"><b>第4章 JComponent类</b></p> <p> JComponent类是所有Swing轻量组件的基类,因此,我们单独用一章对它进行讨论。JComponent对Swing的意义就如同java.awt.Component对AWT的意义一样,它们都是它们各自框架组件的基类。<br> 作为所有Swing轻量组件的基类,JComponent提供了大量的基本功能。要全面了解Swing,就必须知道JComponent类提供的功能,还必须知道如何使用JComponent类。</p> <p> <b>4.1 JComponent类概览</b></p> <p> JComponent扩展java.awt.Container,而java.awt.Container又扩展java.awt.Component,因此,所有的Swing组件都是AWT容器。Component和Container类本身提供了大量的功能,因此,JComponent继承了大量的功能。本章(实际上本书)假设读者有AWT组件和容器的基本知识,这些基本知识在《Java2图形设计,卷Ⅰ:AWT》中用了大量的篇幅来介绍。<br> 因为JComponent为几乎所有的Swing组件提供下层构件,因此,它是一个很大的类,包括100多个public方法。JComponent为它的扩展提供了下面的功能:<br> ■边框。 ■自动滚动。<br> ■可访问性。 ■工具提示。<br> ■双缓存。 ■键击处理。<br> ■调试图形。 ■客户属性。</p> <p> <b>4.1.1 边框</b></p> <p> 任何JComponent的扩展都可以带边框。Swing提供了许多不同风格的边框,如雕刻边框、带标题边框和蚀刻边框。虽然一个组件只能有一个边框,但是边框是可以组合的。因此,从效果上来看,单个组件可有多个边框。图4-1示出了组合边框、带标题边框和定制边框。<br> 边框通常用来组织组件集,但在其他情况下也是很有用的。例如,图4-1示出的组合框可以作为一显示艺术品略图的图形程序的图片帧。通常,可操作的边框在绘图程序中用来移动和改变对象的大小,而且作为Swing的定制边框,这种边框实现起来也很容易。<br> 本章不详细介绍边框,有关边框的知识,请参见第5章“边框、图标和动作”。</p> <p> <b>4.1.2 可访问性</b></p> <p> 可访问性是使人人都能使用软件。例如,为视力不好的用户放大字体或为听力不好的用户显示带声音的标题。<br> Swing的插入式界面模式体系结构通过允许把可选择的界面样式分配给一组组件来支持可访问性。图4-2所示的SwingSet样例应用程序使用一个定制的界面样式,它具有高反差、大字体的外观,为视力不好的用户提供了更好的可读性。<br> 除了Swing插入式界面模式外,使用一个可访问API和一组可访问工具也能支持可访问性。在第4.11节“支持可访问性”中介绍了可访问性。</p> <p><b>4.1.3 双缓存</b></p> <p> 在更新组件(擦除然后重绘组件)时,会产生可察觉的闪烁。双缓存通过在屏外缓存区中更新组件,然后把屏外缓存区的相应部分拷贝到组件的屏上代表中来消除闪烁。<br> 所有的Swing轻量组件都继承了双缓存它们显示内容的能力。一个屏外缓存(由Swing的RepaintManager维护)常用于双缓存JComponent的扩展。<br> 图4-3示出了一个篮球图像的简单动画和含有可拖动的轻量组件的应用程序。<br> 除了为双缓存轻量组件使用屏外缓存外,开发人员还可以为拖动轻量组件或实现动画等其他目的而使用屏外缓存。 </p> <p> 4.1.4 调试图形</p> <p> </p> <p> 4.1.5 自动滚动</p> <p> </p> <p> 4.1.6 工具提示</p> <p> </p> <p> 4.1.7 键击处理和客户属性</p> <p> </p> <p> 4.2 JComponent类结构</p> <p> </p> <p> 4.2.1 Swing组件是AWT容器</p> <p align="center"><b>例4-1 作为容器使用的Swing按钮</b></p> <hr size="1" noshade> import javax.swing.*;<br> import java.awt.*; <p>public class ButtonAsContainer extends JApplet {<br> public void init() {<br> JButton b = new JButton("Swing Buttons Are Containers");</p> <p> b.setLayout(new FlowLayout());<br> b.add(new Button("AWT Button"));<br> b.add(new JButton("Swing Button"));</p> <p> getContentPane().add(b);<br> }<br> }</p> <hr size="1" noshade> <p> 4.2.2 最小尺寸、最大尺寸和首选尺寸</p> <p> </p> <p align="center"><b>例4-2 为JComponent显式地设置首选大小</b></p> <hr size="1" noshade> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*; <p>public class Test extends JApplet {<br> JComboBox sizeCombo = new JComboBox(new Object[] {<br> "null",<br> "100 x 100"<br> });<br> JList list = new JList(new Object[] {<br> "item 1",<br> "item 2",<br> "item 3",<br> "item 4",<br> "item 5",<br> });<br> public void init() {<br> final Container contentPane = getContentPane();</p> <p> list.setBorder(<br> BorderFactory.createLineBorder(Color.black));</p> <p> sizeCombo.setSelectedIndex(0);</p> <p> contentPane.setLayout(new FlowLayout());<br> contentPane.add(list);<br> contentPane.add(new JLabel("preferred size for list:"));<br> contentPane.add(sizeCombo);</p> <p> sizeCombo.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> int index = sizeCombo.getSelectedIndex();</p> <p> if(index == 0)<br> list.setPreferredSize(null);<br> else<br> list.setPreferredSize(<br> new Dimension(100, 100));<br> list.revalidate();<br> }<br> });<br> }<br> }</p> <hr size="1" noshade> <p> 4.3 绘制JComponent组件</p> <p> </p> <p> 4.3.1 Swing组件中的定制绘制</p> <p> </p> <p> 4.3.2 在AWT组件中重载绘制方法</p> <p> </p> <p align="center"><b>例4-3 为定制AWT组件而重载paint()</b></p> <hr size="1" noshade> import java.applet.Applet;<br> import java.awt.*; <p>public class TestApplet extends Applet {<br> public void init() {<br> ImageCanvas imageCanvas = new ImageCanvas("sphere.gif");<br> //ImageCanvas imageCanvas = new ImageCanvas(<br> add(imageCanvas);<br> //setVisible(true);<br> }<br> }<br> class ImageCanvas extends Canvas {<br> Image image;</p> <p> public ImageCanvas(String imageName) {<br> image = Toolkit.getDefaultToolkit().getImage(imageName);</p> <p> MediaTracker mt = new MediaTracker(this);<br> try {<br> mt.addImage(image, 0);<br> mt.waitForID(0);<br> }<br> catch(InterruptedException ex) {<br> ex.printStackTrace();<br> }<br> }<br> public void paint(Graphics g) {<br> g.drawImage(image, 0, 0, null);<br> }<br> public Dimension getPreferredSize() {<br> return new Dimension(image.getWidth(null),<br> image.getHeight(null));<br> }<br> }</p> <hr size="1" noshade> <p> 4.3.3 在Swing组件中重载绘制方法</p> <p> </p> <p align="center"><b>例4-4 带有从JComponent派生的图像画布的小应用程序</b></p> <hr size="1" noshade> import javax.swing.*;<br> import java.awt.*; <p>public class TestApplet extends JApplet {<br> public void init() {<br> Container contentPane = getContentPane();<br> ImageCanvas imagePanel = new ImageCanvas(<br> "sphere.gif",<br> "a blue sphere");<br> imagePanel.setBorder(<br> BorderFactory.createTitledBorder("ImageCanvas"));</p> <p> contentPane.setLayout(new FlowLayout());<br> contentPane.add(imagePanel);<br> }<br> }<br> </p> <hr size="1" noshade> <p align="center"><b>例4-5 为定制Swing组件而重载paintComponent()</b></p> <hr size="1" noshade> class ImageCanvas extends JPanel {<br> ImageIcon icon; <p> public ImageCanvas(String imageName, String description) {<br> //icon = new ImageIcon(imageName, description);<br> icon =new ImageIcon(this.getClass().getResource(imageName),description);<br> }<br> public void paintComponent(Graphics g) {<br> Insets insets = getInsets();<br> super.paintComponent(g);<br> icon.paintIcon(this, g, insets.left, insets.top);<br> }<br> public Dimension getPreferredSize() {<br> Insets insets = getInsets();<br> return new Dimension(<br> icon.getIconWidth() + insets.left + insets.right, <br> icon.getIconHeight() + insets.top + insets.bottom);<br> }<br> }</p> <hr size="1" noshade> <p> </p> <p>4.3.4 paint、repaint和update方法</p> <p> </p> <p> 4.3.5 validate、invalidate和revalidate方法</p> <p> </p> <p> 4.3.6 不透明组件与透明组件的比较</p> <p> </p> <p align="center"><b>例4-6 不透明测试小应用程序</b></p> <hr size="1" noshade> public class OpaqueTest extends JApplet {<br> public void init() {<br> Container contentPane = getContentPane();<br> RainPanel rainPanel = new RainPanel(); <p> ColoredPanel opaque = new ColoredPanel(),<br> transparent = new ColoredPanel();</p> <p> // JComponents are opaque by default, so the opaque<br> // property only needs to be set for transparent<br> transparent.setOpaque(false);</p> <p> rainPanel.add(opaque);<br> rainPanel.add(transparent);</p> <p> contentPane.add(rainPanel, BorderLayout.CENTER);</p> <p> }<br> }</p> <hr size="1" noshade> <p align="center"><b>例4-7 不容透明Swing组件</b></p> <hr size="1" noshade> import javax.swing.*;<br> import java.awt.*; <p>public class OpaqueTest extends JApplet {<br> public void init() {<br> Container contentPane = getContentPane();<br> RainPanel rainPanel = new RainPanel();</p> <p> ColoredPanel opaque = new ColoredPanel(),<br> transparent = new ColoredPanel();</p> <p> // JComponents are opaque by default, so the opaque<br> // property only needs to be set for transparent<br> transparent.setOpaque(false);</p> <p> rainPanel.add(opaque);<br> rainPanel.add(transparent);</p> <p> contentPane.add(rainPanel, BorderLayout.CENTER);</p> <p> System.out.println(opaque.isOpaque());<br> System.out.println(transparent.isOpaque());<br> }<br> }<br> class RainPanel extends JPanel {<br> ImageIcon rain = new ImageIcon(this.getClass().getResource("rain.gif"));<br> private int rainw = rain.getIconWidth();<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -