?? 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>易都網(wǎng)--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,網(wǎng)絡安全,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組件提供下層構(gòu)件,因此,它是一個很大的類,包括100多個public方法。JComponent為它的擴展提供了下面的功能:<br> ■邊框。 ■自動滾動。<br> ■可訪問性。 ■工具提示。<br> ■雙緩存。 ■鍵擊處理。<br> ■調(diào)試圖形。 ■客戶屬性。</p> <p> <b>4.1.1 邊框</b></p> <p> 任何JComponent的擴展都可以帶邊框。Swing提供了許多不同風格的邊框,如雕刻邊框、帶標題邊框和蝕刻邊框。雖然一個組件只能有一個邊框,但是邊框是可以組合的。因此,從效果上來看,單個組件可有多個邊框。圖4-1示出了組合邊框、帶標題邊框和定制邊框。<br> 邊框通常用來組織組件集,但在其他情況下也是很有用的。例如,圖4-1示出的組合框可以作為一顯示藝術品略圖的圖形程序的圖片幀。通常,可操作的邊框在繪圖程序中用來移動和改變對象的大小,而且作為Swing的定制邊框,這種邊框?qū)崿F(xiàn)起來也很容易。<br> 本章不詳細介紹邊框,有關邊框的知識,請參見第5章“邊框、圖標和動作”。</p> <p> <b>4.1.2 可訪問性</b></p> <p> 可訪問性是使人人都能使用軟件。例如,為視力不好的用戶放大字體或為聽力不好的用戶顯示帶聲音的標題。<br> Swing的插入式界面模式體系結(jié)構(gòu)通過允許把可選擇的界面樣式分配給一組組件來支持可訪問性。圖4-2所示的SwingSet樣例應用程序使用一個定制的界面樣式,它具有高反差、大字體的外觀,為視力不好的用戶提供了更好的可讀性。<br> 除了Swing插入式界面模式外,使用一個可訪問API和一組可訪問工具也能支持可訪問性。在第4.11節(jié)“支持可訪問性”中介紹了可訪問性。</p> <p><b>4.1.3 雙緩存</b></p> <p> 在更新組件(擦除然后重繪組件)時,會產(chǎn)生可察覺的閃爍。雙緩存通過在屏外緩存區(qū)中更新組件,然后把屏外緩存區(qū)的相應部分拷貝到組件的屏上代表中來消除閃爍。<br> 所有的Swing輕量組件都繼承了雙緩存它們顯示內(nèi)容的能力。一個屏外緩存(由Swing的RepaintManager維護)常用于雙緩存JComponent的擴展。<br> 圖4-3示出了一個籃球圖像的簡單動畫和含有可拖動的輕量組件的應用程序。<br> 除了為雙緩存輕量組件使用屏外緩存外,開發(fā)人員還可以為拖動輕量組件或?qū)崿F(xiàn)動畫等其他目的而使用屏外緩存。 </p> <p> 4.1.4 調(diào)試圖形</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類結(jié)構(gòu)</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 + -