?? s13.htm
字號(hào):
<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 圖形設(shè)計(jì)卷Ⅱ: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)絡(luò)安全,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="s12.htm">上一頁</a>][<a href="s14.htm">下一頁</a>]</p> <p align="center"><b>第13章 滾動(dòng)</b></p> <p> 本章介紹Swing的滾動(dòng)體系結(jié)構(gòu),這個(gè)體系結(jié)構(gòu)包括兩個(gè)輕量Swing容器、一個(gè)Scrollable接口、和一個(gè)JScrollBar類。其中,這兩個(gè)輕量Swing容器是JViewport和JScrollPane,設(shè)計(jì)這個(gè)Scrollable接口來支持有特殊滾動(dòng)需求的組件。<br> JViewport實(shí)例很少被實(shí)例化,也很少被直接使用,然而,本章仍將用相當(dāng)大的篇幅來介紹JViewport類,因?yàn)樗荢wing滾動(dòng)體系結(jié)構(gòu)的基礎(chǔ)組件。<br> 設(shè)計(jì)JScrollPane組件來替代AWT的重量組件ScrollPane。JScrollPane在AWT的ScrollPane基礎(chǔ)上做了許多改進(jìn),包括具有配置行頭部的能力和具有指定在滾動(dòng)窗格角部組件的能力。<br> Scrollable接口是為表格、樹、文本組件和列表等包含數(shù)據(jù)行或數(shù)據(jù)列的可滾動(dòng)組件而設(shè)計(jì)的。<br> JScrollBar組件是一個(gè)用來實(shí)現(xiàn)手動(dòng)滾動(dòng)的滾動(dòng)條。雖然Swing的JScrollPane組件在大多數(shù)滾動(dòng)情況是足夠用了,但是,有時(shí)為了性能或資源的考,還必須實(shí)現(xiàn)手動(dòng)滾動(dòng)。在這種情況下,可以用JScrollBar組件來滾動(dòng)容器的內(nèi)容。 </p> <p> <b>13.1 JViewport</b></p> <p> JViewport類是Swing滾動(dòng)體系結(jié)構(gòu)的基礎(chǔ)。就如它的名字所指出的那樣,JViewport的實(shí)例提供一個(gè)視口,視圖的特定區(qū)域可以顯示在這個(gè)視口中。可以操縱由視口顯示的視圖的位置,以便在不同的時(shí)刻,使不同的視圖區(qū)域出現(xiàn)在這個(gè)視口中。<br> 圖13-1所示的小應(yīng)用程序包含JViewport的一個(gè)實(shí)例,它的視圖是JLabel的一個(gè)實(shí)例。該標(biāo)簽配備了一幅比顯示圖像的視口還要大的圖像。這個(gè)小應(yīng)用程序提供了四個(gè)用于調(diào)整視口中視圖位置的按鈕。<br> 圖13-1中的左圖顯示這個(gè)小應(yīng)用程序開始時(shí)的樣子。右圖顯示出在反復(fù)激活up和left按鈕后,這個(gè)小應(yīng)用程序的梯子。應(yīng)該強(qiáng)調(diào)的是,反復(fù)激活按鈕不是滾動(dòng)視口中視圖最理想的方式,但是它說明了一個(gè)視口是怎樣調(diào)整其視圖位置的。<br> 這個(gè)小應(yīng)用程序創(chuàng)建JViewport的一個(gè)實(shí)例和JLabel的一個(gè)實(shí)例。通過調(diào)用JVieweport.setView()來指定這個(gè)標(biāo)簽作為視口的視圖。這個(gè)小應(yīng)用程序還創(chuàng)建了一個(gè)ControlPanel實(shí)例(它是JPanel的一個(gè)擴(kuò)展),這個(gè)實(shí)例包含了四個(gè)用于滾動(dòng)標(biāo)簽的按鈕。 </p> <p align="center"><b>例13-1 用JViewport的一個(gè)實(shí)例來滾動(dòng)一幅圖像</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JViewport viewport = new JViewport();<br> JPanel view = new JPanel();</p> <p> view.add(new JLabel(<br> new ImageIcon("anjinAndMariko.gif")));</p> <p> viewport.setView(view);</p> <p> contentPane.add(new ControlPanel(viewport), <br> BorderLayout.NORTH);<br> contentPane.add(viewport, BorderLayout.CENTER);<br> }<br> }<br> class ControlPanel extends JPanel { <br> private JViewport viewport;</p> <p> private JButton[] buttons = {<br> new JButton("up"), new JButton("down"),<br> new JButton("left"), new JButton("right")<br> };</p> <p> public ControlPanel(JViewport vp) {<br> viewport = vp;</p> <p> for(int i=0; i < buttons.length; ++i) {<br> add(buttons[i]);</p> <p> buttons[i].addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> scroll(e.getActionCommand());<br> }<br> });<br> }<br> }<br> private void scroll(String actionCmd) {<br> Point vp = viewport.getViewPosition();</p> <p> if(actionCmd.equals("up")) vp.y += 5; <br> else if(actionCmd.equals("down")) vp.y -= 5; <br> else if(actionCmd.equals("left")) vp.x += 5; <br> else if(actionCmd.equals("right")) vp.x -= 5; </p> <p> viewport.setViewPosition(vp);<br> }<br> }</p> <hr size="1" noshade> <p> 13.1.1 拖動(dòng)視口中的視圖</p> <p> </p> <p align="center"><b>例13-2 拖動(dòng)視口中的視圖</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JLabel label = new JLabel(new ImageIcon("pic.gif"));<br> JViewport vp = new JViewport();<br> ViewportDragListener listener = <br> new ViewportDragListener(vp);</p> <p> vp.setView(label);<br> vp.addMouseListener(listener);<br> vp.addMouseMotionListener(listener);</p> <p> contentPane.add(vp, BorderLayout.CENTER);<br> }<br> }<br> class ViewportDragListener extends MouseAdapter<br> implements MouseMotionListener {<br> private JViewport viewport;<br> private Point last = new Point(), scrollTo = new Point();</p> <p> public ViewportDragListener(JViewport viewport) {<br> this.viewport = viewport; <br> }<br> public void mousePressed(MouseEvent e) {<br> last.x = e.getPoint().x;<br> last.y = e.getPoint().y;<br> }<br> public void mouseMoved(MouseEvent e) {<br> }<br> public void mouseDragged(MouseEvent e) {<br> Point drag = e.getPoint();<br> Point viewPos = viewport.getViewPosition();<br> Point offset = new Point(drag.x-last.x, drag.y-last.y);<br> last.x = drag.x;<br> last.y = drag.y;</p> <p> if(viewport.contains(drag)) {<br> scrollTo.x = viewPos.x - offset.x;<br> scrollTo.y = viewPos.y - offset.y;<br> viewport.setViewPosition(scrollTo);<br> }<br> }<br> }</p> <hr size="1" noshade> <p> 13.1.2 使用scrollRectToVisible</p> <p> </p> <p align="center"><b>例13-3 使用scrollRectToVisible()</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br> import javax.swing.event.*; <p>public class Test extends JApplet {<br> private JButton buttons[] = {<br> new JButton(), new JButton(), new JButton(),<br> new JButton(), new JButton(), new JButton(),<br> new JButton(), new JButton(), new JButton(),<br> new JButton(), new JButton(), new JButton(),<br> new JButton(), new JButton(), new JButton(),<br> new JButton(), new JButton(), new JButton(),<br> };<br> public Test() {<br> Container contentPane = getContentPane();<br> JViewport viewport = new JViewport();<br> JPanel view = new JPanel();<br> JPanel controlPanel = new ControlPanel(buttons);</p> <p> view.setLayout(new GridLayout(0,3));</p> <p> for(int i=0; i < buttons.length; ++i) {<br> buttons[i].setText("button # " + i);<br> buttons[i].setPreferredSize(new Dimension(150,50));<br> view.add(buttons[i]);<br> }</p> <p> viewport.setView(view);</p> <p> contentPane.add(controlPanel, BorderLayout.NORTH);<br> contentPane.add(viewport, BorderLayout.CENTER);<br> }<br> }<br> class ControlPanel extends JPanel { <br> private JComboBox combo = new JComboBox();</p> <p> public ControlPanel(final JButton[] buttons) {<br> add(combo);</p> <p> for(int i=0; i < buttons.length; ++i) {<br> combo.addItem("button number " + i);<br> }<br> combo.addItemListener(new ItemListener() {<br> public void itemStateChanged(ItemEvent e) {<br> int index = combo.getSelectedIndex();<br> JButton button = buttons[index];<br> Dimension size = button.getSize();</p> <p> buttons[index].scrollRectToVisible(<br> new Rectangle(0,0, size.width,size.height));<br> }<br> });<br> }<br> }</p> <hr size="1" noshade> <p> 13.1.3 JViewport屬性</p> <p> </p> <p> 13.1.4 JViewport事件</p> <p> </p> <p align="center"><b>例13-4 對JViewport變化事件的響應(yīng)</b></p> <hr noshade size="1"> import java.awt.*;<br> import java.awt.event.*;<br> import javax.swing.*;<br> import javax.swing.event.*; <p>public class Test extends JApplet {<br> public Test() {<br> Container contentPane = getContentPane();<br> JViewport viewport = new JViewport();<br> JPanel view = new JPanel();</p> <p> view.add(new JLabel(<br> new ImageIcon("anjinAndMariko.gif")));</p> <p> viewport.setView(view);</p> <p> contentPane.add(new ControlPanel(viewport), <br> BorderLayout.NORTH);<br> contentPane.add(viewport, BorderLayout.CENTER);<br> contentPane.add(new StatusPanel(viewport),<br> BorderLayout.SOUTH);<br> }<br> }<br> class StatusPanel extends JPanel { <br> private JLabel extentLabel = new JLabel(),<br> viewPositionLabel = new JLabel(),<br> viewSizeLabel = new JLabel();<br> private JViewport viewport;</p> <p> public StatusPanel(JViewport vp) {<br> viewport = vp;</p> <p> setBorder(BorderFactory.createEtchedBorder());<br> setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));</p> <p> extentLabel.setAlignmentX(0.5f);<br> viewPositionLabel.setAlignmentX(0.5f);<br> viewSizeLabel.setAlignmentX(0.5f);</p> <p> add(extentLabel);<br> add(viewPositionLabel);<br> add(viewSizeLabel);</p> <p> viewport.addChangeListener(new ChangeListener() {<br> public void stateChanged(ChangeEvent e) {<br> Dimension extent = viewport.getExtentSize();<br> Point viewPosition = viewport.getViewPosition();<br> Rectangle viewSize = viewport.getViewRect();</p> <p> extentLabel.setText("View Extent: " + <br> extent.toString());<br>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -