📄 s03.htm
字号:
----<br> 图3-10 <a href="s03_tu10.jar">模型属性变化通知</a>(当下载对话框出现时,可直接点击打开按钮试试)<br> ----<br> 这个应用程序实现一个属性变化监听器,该监听器在树的rootVisible属性修改时,显示一个消息对话框。</p> <p> class PropertyListener implements PropertyChangeListener {<br> public void propertyChange(PropertyChangeEvent e) {<br> String name = e.getPropertyName();</p> <p> if(name.equals(JTree.ROOT_VISIBLE_PROPERTY)) {<br> String msg = "Root Visible Property: " +<br> e.getNewValue().toString();</p> <p> JOptionPane.showMessageDialog(<br> Test.this, // parent comp<br> msg, // message <br> "Property Change", // title<br> JOptionPane.INFORMATION_MESSAGE);<br> }<br> }<br> }<br> 大多数属性变化监听器只对特定类型事件源的关联属性的一个子集感兴趣。属性变化监听器通常通过获取改变的属性的名字,并把它与一个公共常量相比较,以决定是否处理这个属性变化。下面就是这种属性变化监听器的例子。<br> 例3-3列出了图3-10所示的应用程序的完整代码。<br> </p> <p align="center"><b>例3-3 处理模型属性变化通知 </b></p> <hr size="1" noshade> <p> import javax.swing.*;<br> import java.awt.*;<br> import java.awt.event.*;<br> import java.util.*;<br> import java.beans.*;</p> <p> public class Test extends JFrame {<br> JTree tree = new JTree();</p> <p> public Test() {<br> Container contentPane = getContentPane();<br> JScrollPane scrollPane = new JScrollPane(tree);</p> <p> contentPane.add(new ControlPanel(), BorderLayout.NORTH);<br> contentPane.add(scrollPane, BorderLayout.CENTER);</p> <p> tree.addPropertyChangeListener(new PropertyListener());<br> }<br> class ControlPanel extends JPanel {<br> JCheckBox showRoot = new JCheckBox("show root node");</p> <p> public ControlPanel() {<br> showRoot.setSelected(tree.isRootVisible());</p> <p> setLayout(new FlowLayout());<br> add(showRoot);</p> <p> showRoot.addActionListener(new ActionListener() {<br> public void actionPerformed(ActionEvent e) {<br> tree.setRootVisible(showRoot.isSelected()); <br> }<br> });<br> }<br> }<br> class PropertyListener implements PropertyChangeListener {<br> public void propertyChange(PropertyChangeEvent e) {<br> String name = e.getPropertyName();</p> <p> if(name.equals(JTree.ROOT_VISIBLE_PROPERTY)) {<br> String msg = "Root Visible Property: " +<br> e.getNewValue().toString();</p> <p> JOptionPane.showMessageDialog(<br> Test.this, // parent comp<br> msg, // message <br> "Property Change", // title<br> JOptionPane.INFORMATION_MESSAGE);<br> }<br> }<br> }<br> public static void main(String args[]) {<br> GJApp.launch(new Test(), <br> "Model Property Changes",300,300,450,300);<br> }<br> }<br> class GJApp extends WindowAdapter {<br> static private JPanel statusArea = new JPanel();<br> static private JLabel status = new JLabel(" ");<br> static private ResourceBundle resources;</p> <p> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h) {<br> launch(f,title,x,y,w,h,null); <br> }<br> public static void launch(final JFrame f, String title,<br> final int x, final int y, <br> final int w, int h,<br> String propertiesFilename) {<br> f.setTitle(title);<br> f.setBounds(x,y,w,h);<br> f.setVisible(true);</p> <p> statusArea.setBorder(BorderFactory.createEtchedBorder());<br> statusArea.setLayout(new FlowLayout(FlowLayout.LEFT,0,0));<br> statusArea.add(status);<br> status.setHorizontalAlignment(JLabel.LEFT);</p> <p> f.setDefaultCloseOperation(<br> WindowConstants.DISPOSE_ON_CLOSE);</p> <p> if(propertiesFilename != null) {<br> resources = ResourceBundle.getBundle(<br> propertiesFilename, Locale.getDefault());<br> }</p> <p> f.addWindowListener(new WindowAdapter() {<br> public void windowClosed(WindowEvent e) {<br> System.exit(0);<br> }<br> });<br> }<br> static public JPanel getStatusArea() {<br> return statusArea;<br> }<br> static public void showStatus(String s) {<br> status.setText(s);<br> }<br> static Object getResource(String key) {<br> if(resources != null) {<br> return resources.getString(key);<br> }<br> return null;<br> }<br> }<br> </p> <hr size="1" noshade> <table width="100%" border="1" cellspacing="0" cellpadding="0" bordercolorlight="#000000" bordercolordark="#FFFFFF"> <tr bgcolor="#CCCCCC"> <td> <p><b>Swing提示</b></p> </td> </tr> </table> <p><b>一个模型的多个视图</b><br> 一个Swing模型可以有多个视图,这点常常得不到人们的重视。初看起来,一个模型带多个视图是毫无意义的,例如,使一个进度条和一个滚动条共享一个模型有什么价值呢?<br> 图3-8所示的小应用程序提供了一个模型带多个视图的例子。该小应用程序的滑杆和滚动窗格共享一个模型,以便滑杆的变化能在滚动窗格中显示的图像上得到反应。<br> 还有许多其他的多个视图共享一个模型的情况。例如,可以在JTable实例和一个定制组件之间共享一个表格模型。这个定制组件绘制表格模型中所含数据的图表。把模型与视图分离使Swing组件更灵活和更具有再使用性。 </p> <hr size="1" noshade> <p><b>3.2.5 UI代表</b></p> <p> 组件把实现其用户界面(UI)的任务交给一个UI代表来完成。<br> UI代表是在它们的组件的构造方法中实例化的,并且可以作为组件的一个关联属性来访问。例如,下面所列的JSlider.java的部分代码举例说明了一个滑杆是如何创建它的代表的以及滑杆的UI代表是如何被访问的。<br> //From.JSlider.java<br> //Note:the ui object below is a protected member of JComponent<br> class JSlider extends JComponent<br> implemebts SwingConstants,Accessible{<br> ...<br> public JSlider(int orientation ,int min,int max,int value){<br> ...<br> updateUI();<br> }<br> ...<br> public void updateUI(){<br> ...<br> setUI((SliderUI) UIManager.getUI(this));<br> }<br> ...<br> public SliderUI(){<br> return (SliderUI) ui;<br> }<br> ...<br> }<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -