📄 s13.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="s12.htm">上一页</a>][<a href="s14.htm">下一页</a>]</p> <p align="center"><b>第13章 滚动</b></p> <p> 本章介绍Swing的滚动体系结构,这个体系结构包括两个轻量Swing容器、一个Scrollable接口、和一个JScrollBar类。其中,这两个轻量Swing容器是JViewport和JScrollPane,设计这个Scrollable接口来支持有特殊滚动需求的组件。<br> JViewport实例很少被实例化,也很少被直接使用,然而,本章仍将用相当大的篇幅来介绍JViewport类,因为它是Swing滚动体系结构的基础组件。<br> 设计JScrollPane组件来替代AWT的重量组件ScrollPane。JScrollPane在AWT的ScrollPane基础上做了许多改进,包括具有配置行头部的能力和具有指定在滚动窗格角部组件的能力。<br> Scrollable接口是为表格、树、文本组件和列表等包含数据行或数据列的可滚动组件而设计的。<br> JScrollBar组件是一个用来实现手动滚动的滚动条。虽然Swing的JScrollPane组件在大多数滚动情况是足够用了,但是,有时为了性能或资源的考,还必须实现手动滚动。在这种情况下,可以用JScrollBar组件来滚动容器的内容。 </p> <p> <b>13.1 JViewport</b></p> <p> JViewport类是Swing滚动体系结构的基础。就如它的名字所指出的那样,JViewport的实例提供一个视口,视图的特定区域可以显示在这个视口中。可以操纵由视口显示的视图的位置,以便在不同的时刻,使不同的视图区域出现在这个视口中。<br> 图13-1所示的小应用程序包含JViewport的一个实例,它的视图是JLabel的一个实例。该标签配备了一幅比显示图像的视口还要大的图像。这个小应用程序提供了四个用于调整视口中视图位置的按钮。<br> 图13-1中的左图显示这个小应用程序开始时的样子。右图显示出在反复激活up和left按钮后,这个小应用程序的梯子。应该强调的是,反复激活按钮不是滚动视口中视图最理想的方式,但是它说明了一个视口是怎样调整其视图位置的。<br> 这个小应用程序创建JViewport的一个实例和JLabel的一个实例。通过调用JVieweport.setView()来指定这个标签作为视口的视图。这个小应用程序还创建了一个ControlPanel实例(它是JPanel的一个扩展),这个实例包含了四个用于滚动标签的按钮。 </p> <p align="center"><b>例13-1 用JViewport的一个实例来滚动一幅图像</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 拖动视口中的视图</p> <p> </p> <p align="center"><b>例13-2 拖动视口中的视图</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变化事件的响应</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>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -