📄 s03.htm
字号:
import java.awt.event.*;<br> import java.util.*;</p> <p> public class Test extends JApplet {<br> DefaultBoundedRangeModel model =<br> new DefaultBoundedRangeModel(100,0,0,100);</p> <p> JSlider slider = new JSlider(model);<br> JLabel readOut = new JLabel("100%");</p> <p> //ImageIcon image = new ImageIcon("shortcake.jpg"); 原文 <br> ImageIcon image = new ImageIcon(this.getClass().getResource("shortcake.jpg"));<br> <br> ImageView imageView = new ImageView(image, model);</p> <p> public void init() {<br> Container contentPane = getContentPane();<br> JPanel panel = new JPanel();</p> <p> panel.add(new JLabel("Set Image Size:"));<br> panel.add(slider);<br> panel.add(readOut);</p> <p> contentPane.add(panel, BorderLayout.NORTH);<br> contentPane.add(imageView, BorderLayout.CENTER);</p> <p> model.addChangeListener(new ReadOutSynchronizer());<br> }<br> class ReadOutSynchronizer implements ChangeListener {<br> public void stateChanged(ChangeEvent e) {<br> String s = Integer.toString(model.getValue());<br> readOut.setText(s + "%");<br> readOut.revalidate();<br> }<br> }<br> }<br> class ImageView extends JScrollPane {<br> JPanel panel = new JPanel();<br> Dimension originalSize = new Dimension();<br> Image originalImage;<br> ImageIcon icon;</p> <p> public ImageView(ImageIcon icon, BoundedRangeModel model) {<br> panel.setLayout(new BorderLayout());<br> panel.add(new JLabel(icon));</p> <p> this.icon = icon;<br> this.originalImage = icon.getImage();</p> <p> setViewportView(panel);<br> model.addChangeListener(new ModelListener());</p> <p> originalSize.width = icon.getIconWidth();<br> originalSize.height = icon.getIconHeight();<br> }<br> class ModelListener implements ChangeListener {<br> public void stateChanged(ChangeEvent e) {<br> BoundedRangeModel model = <br> (BoundedRangeModel)e.getSource();</p> <p> if( ! model.getValueIsAdjusting()) {<br> int min = model.getMinimum(), <br> max = model.getMaximum(), <br> span = max - min,<br> value = model.getValue();</p> <p> double multiplier = (double)value / (double)span;</p> <p> multiplier = multiplier == 0.0 ? <br> 0.01 : multiplier;<br> <br> Image scaled = originalImage.getScaledInstance(<br> (int)(originalSize.width * multiplier),<br> (int)(originalSize.height * multiplier),<br> Image.SCALE_FAST);</p> <p> icon.setImage(scaled);<br> panel.revalidate();<br> }<br> }<br> }<br> }</p> <p> test.html文件:</p> <p> <title>Test</title><br> <hr><br> <applet code="Test.class" width=375 height=400><br> </applet><br> <hr></p> <p> 注:如用IE浏览器浏览test.html,JApplet不能正常显示,不过你可以用appletview test.html命令来浏览。</p> <hr> <p> 4.轻量事件通知<br> 由“模型”一节我们知道,模型能够提供轻量通知和状态通知两种通知。轻量通知使用一个只知道事件源的ChangeEvent(变化事件),状态通知则使用提供有关变化的更多信息的事件。<br> 变化事件由一些事件来处理,这些对象的类实现ChangeListener接口。接口总结3-1对ChangeListener接口进行了总结。<br> 接口总结3-1 ChangeListener<br> public abstract void stateChanged (ChageEvent)<br> 与大多数监听器一样,ChangeListener接口只定义了一个方法。StateChanged方法以ChangeEvent的一个实例作为参数。类总结3-1中介绍了ChangeEvent类。<br> 类总结3-1 ChangeEvent<br> 扩展:java.util.EventObject<br> 构造方法<br> public ChageEvent(Object source)<br> ChangeEvent类仅提供了一个构造方法,没有提供其他方法。ChangeEvent构造方法以事件源作为参数。<br> 图3-9所示的小应用程序通过监控滑杆的值来说明轻量通知。一个变化监听器添加到这个小应用程序的滑杆中以获得滑杆值并更新这个小应用程序的状态区。<br> 图3-9轻量通知<br> 例3-2列出了图3-9所示的小应用程序的代码</p> <p align="center"> <b>例3-2一个滑杆的轻量通知</b> </p> <p> import java.awt.*;<br> import javax.swing.*;<br> import javax.swing.event.*;<br> public class Test extends JApplet{<br> public void init(){<br> JSlider slider = new JSlider(0,100,50);<br> getContentPane().add(slider,BorderLayout.CENTER);<br> slider.addChangeListener(new ChangeListener(){<br> public void stateChanged(ChangeEvent e){<br> JSlider s = (JSlider) e.getSource();<br> showStatus(Integer.toString(s.getValue()));<br> }<br> });<br> }<br> } </p> <p> 5.状态事件通知<br> 对不经常变化的模型属性,模型使用状态通知。状态通知激发所有类型的事件,并且提供比事件源更多信息(轻量事件通知仅提供事件源一种信息)。例如,当选取或取消选取一个单选按钮时,按钮模型将激发一个项事件。<br> 6.属性变化通知<br> 当模型的关联属性变化时(当一个属性的变化激发一个属性变化事件,则这个属性称作关联属性。)模型会以一个java.beans.PropertyChangeEvent的形式产生状态通知。属性变化通知由一些对象来处理,这些对象的类实现java.beans.PropertyChangeListener接口,接口总结3-2中总结了这个接口。 <br> </p> <table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolorlight="#000000" bordercolordark="#FFFFFF"> <tr bgcolor="#CCCCCC"> <td> <p><b>接口总结3-2 PropertyChangeListener</b></p> </td> </tr> </table> <p> public void propertyChange(PropertyChangeEvent)<br> PropertyChangeListener只定义了一个方法,该方法所带参数是PropertyChangeEvent的一个实例。类总结3-2总结了PropertyChangeEvent类。</p> <table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolorlight="#000000" bordercolordark="#FFFFFF"> <tr bgcolor="#CCCCCC"> <td> <p><b>类总结3-2 PropertyChangeEvent</b></p> </td> </tr> </table> <p> 扩展:java.utilEventObject<br> 1.构造方法<br> public PropertyChangeEvent(Object source,String propertyName,Object oldValue,Object newValue)<br> 属性变化事件以事件源、属性名、属性的旧值和新值为参数来构造。<br> 2.方法<br> public String getPropertyName()<br> public Object getNewValue()<br> public Object getOldValue()<br> public void setPropagationld(Object propagationld)<br> public Object getPropagationld() </p> <hr> <p> 属性变化监听器一般都要注意属性名的变化,因为大多数监听器对它们处理的属性是有选择的。同样,几乎所有的属性变化监听器都要跟踪属性的新值。属性变化监听器设计如下:</p> <p> //code fragment...<br> SomePropertyChangeListener implements PropertyChangeListener{<br> public void propertyChange(PropertyChangeEvent e){<br> String name=e.getName();<br> //if property is one this listener is interested in ...<br> if(name.equals(" PropertyImInterestedIn")){<br> SomeType newValue = (SomeType)e.getNewValue();<br> //act upon new value...<br> }<br> }<br> 图3-10所示的应用程序用一个树和一个用于设置该树的rootVisible属性的复选框举例说明了处理模型属性变化事件。如果rootVisible属性是true,则树的根节点是可视的,否则,根节点是隐藏的。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -