﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-X-LIN-随笔分类-java</title><link>http://www.cppblog.com/X-LIN/category/19869.html</link><description /><language>zh-cn</language><lastBuildDate>Sat, 22 Sep 2012 19:12:49 GMT</lastBuildDate><pubDate>Sat, 22 Sep 2012 19:12:49 GMT</pubDate><ttl>60</ttl><item><title>JList应用</title><link>http://www.cppblog.com/X-LIN/archive/2012/09/19/191292.html</link><dc:creator>林</dc:creator><author>林</author><pubDate>Wed, 19 Sep 2012 13:45:00 GMT</pubDate><guid>http://www.cppblog.com/X-LIN/archive/2012/09/19/191292.html</guid><wfw:comment>http://www.cppblog.com/X-LIN/comments/191292.html</wfw:comment><comments>http://www.cppblog.com/X-LIN/archive/2012/09/19/191292.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/X-LIN/comments/commentRss/191292.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/X-LIN/services/trackbacks/191292.html</trackback:ping><description><![CDATA[<p>制作更酷的JList界面<br />内容：<br />1。绘制器的工作原理。<br />2。用自订的绘制器更换JList和JComboBox的外观。<br />3。让新的外观响应鼠标事件。</p>
<p>借助swing体系的mvc设计理念，为组件更换不同的外观成为轻而易举的事情。本文主要以JList和JComboBox为例讲解ListCellRenderer的原理与用法.</p>
<p><br />一、绘制器的工作原理<br />不管是JList还是JComboBox，它们都用到了ListCellRenderer,因为JComboBox本身就是由一个下拉式的JList和TextField组成的. 在这里，它们使用了callback的机制。</p>
<p>callback的一是种常见的方式是在A类中调用B类中的方法，在A类中先要登记一个(也可以是多个)B类的实例引用，在需要调用时再通过该实例来调用它的内部方法.这样的机制在很多的设计模式中都有用到，如Observer等.还有AWT的事件机制也用到了callback.</p>
<p>要实现callback，通常将B类设计成一个能被callback的接口.在JList的绘制器中，swing提供了一个ListCellRenderer接口，<br />public interface ListCellRenderer {<br />&nbsp;&nbsp;&nbsp; Component getListCellRendererComponent(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isSelected,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean cellHasFocus);<br />}<br />这个接口只提供一个方法，我们只要实现了这个接口，并将它的实例引用传给JList,就可以将JList替换成不同的样式了.看一下ListCellRenderer是如何工作的,</p>
<p>在绘制JList的每个Cell之前,它会去调用getListCellComponent( ),得到一个Component,并<br />将这个Component绘制在正确的位置.因为getListCellComponent( )返回的是Component,所以我们几乎可以扩展任意一个Component,来改变JList,JComboBox等的外观.</p>
<p>二、制作自已的绘制器<br />我们现在要想让JList中显示一组学生名单，同时每个名单前显示该学生的图标.如下图所示</p>
<p>我们先来想一想，Swing中有什么组件既可以显示图标也可以显示文字? JLabel.对了。我们就用JLabel作为JList的绘制器,　看看我扩展的JLabel类，它实现了ListCellRenderer接口:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 可以显示图标的ListCell绘制器 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class IconListItemRenderer extends JLabel implements ListCellRenderer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; private Border<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectedBorder = BorderFactory.createLineBorder(Color.blue,1),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; emptyBorder = BorderFactory.createEmptyBorder(1,1,1,1);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Component getListCellRendererComponent(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isSelected,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean cellHasFocus)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IconListItem item = (IconListItem)value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setIcon(item.getIcon());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setText(item.getText());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if ( isSelected ) setBorder (selectedBorder);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else setBorder(emptyBorder);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />大家看到，getListCellRendererComponent方法会传入几个参数,我们就用它传入的几个参数设置JLabel的外观:图标与文字。在这个类中，我们用一个IconListItem接收调用者传过来的value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IconListItem item = (IconListItem) value;<br />IconListItem是我另外定义好的一个类，它用来存放每一个List Item的值,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import javax.swing.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class IconListItem<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Icon icon;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public IconListItem(Icon icon, String text)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.icon = icon;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Icon getIcon() { return icon;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getText() { return text;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setIcon(Icon icon){ this.icon = icon;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setText(String text){ this.text = text; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />这样的话，我就可以用getIcon()和getText()方法取得每个List Item的值了,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IconListItem item = (IconListItem) value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setIcon(item.getIcon());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setText(item.getText());</p>
<p>至此，我们就可以用以下方法方便的更换JList的外观了,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list = new JList();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.setCellRenderer(new IconListItemRenderer()); file://安装我们自订的cellRenderer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultListModel listModel = new DefaultListModel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.setModel(listModel);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IconListItem item = new IconListItem(new ImageIcon(...),"John");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; listModel.addElement(item);&nbsp;&nbsp;&nbsp; // 为List增加Item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />由于JComboBox也有一个下拉式清单，所以它的清单也是用ListCellRenderer来绘制的，所以我们也可以将这个IconListItemRenderer给它用:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox list = new JComboBox();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.setRenderer(new IconListItemRenderer()); //装我们自订的cellRenderer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultComboBoxModel comboModel = new DefaultComboBoxModel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.setModel(comboModel);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; IconListItem item = new IconListItem(new ImageIcon(...),"John");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; comboModel.addElement(item);&nbsp;&nbsp;&nbsp; // 为List增加Item<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />注意，JComboBox安装绘制器时是用setRenderer()方法，JList是用setCellRenderer()方法，名字稍有不同.</p>
<p>以上大家看到的是可显示一个图标的List, 下面我们再看一个可显示CheckBox的List是如何实现的,以下是例图:</p>
<p>代码实现:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import javax.swing.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import java.awt.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import javax.swing.border.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; import java.awt.event.*;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* 可以显示CheckBox的ListCell绘制器 */<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class CheckListItemRenderer extends JCheckBox implements ListCellRenderer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Component getListCellRendererComponent(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object value,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean isSelected,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean cellHasFocus)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckListItem item = (CheckListItem)value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setSelected(item.getCheck());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setText(item.getText());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setFont(list.getFont());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.setEnabled(list.isEnabled());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />同样这个绘制器中用一个CheckListItem存放每个List Item的值:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public class CheckListItem<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; boolean check;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public CheckListItem(boolean check, String text)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.check = check;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.text = text;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public boolean getCheck() { return check; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setCheck(boolean _check) { check = _check; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String getText() { return text; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void setText(String _text) { text = _text; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />这个绘制器的用法同IconListItemRenderer一样，不多讲了.</p>
<p>三、让自订的绘制器响就鼠标事件<br />使用以上的CheckListItemRenderer时，大家会发现，虽然List中可以显示CheckBox了，但是用鼠标点击时，没有反应! 现在我就来解决这个问题.要澄清的是，ListCellRenderer本身是只返回一个组件用来绘制一个单元格，不能对用户动作作出反应。为些我们必须在JList上下功夫.JList有一个addMouseListener（）方法可以为自身安装一个鼠标监听器，在这里，我实现了一个MouseAdapter,并让它对mousePressed作出响应:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; class CheckListMouseListener extends MouseAdapter<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void mousePressed(MouseEvent e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JList list = (JList) e.getSource();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int index = list.locationToIndex(e.getPoint());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CheckListItem item = (CheckListItem)list.getModel().getElementAt(index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item.setCheck(! item.getCheck());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Rectangle rect = list.getCellBounds(index, index);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; list.repaint(rect);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />使用时, 用addMouseListener(new CheckListMouseListener())就行了.</p>
<p>除了包含CheckBox的JList外，许多情况下，我们需要为自制的绘制器加上动作响应，如我们要实现一个可编辑的JList,　除了要扩展JTextField及实现ListCellRenderer之外，还要写一个鼠标监听器和键盘监听器，当双击时，JList变成可编辑状态，当回车时，还原成不可编辑状态</p><img src ="http://www.cppblog.com/X-LIN/aggbug/191292.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/X-LIN/" target="_blank">林</a> 2012-09-19 21:45 <a href="http://www.cppblog.com/X-LIN/archive/2012/09/19/191292.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java日期显示格式实例</title><link>http://www.cppblog.com/X-LIN/archive/2012/09/16/190913.html</link><dc:creator>林</dc:creator><author>林</author><pubDate>Sun, 16 Sep 2012 14:39:00 GMT</pubDate><guid>http://www.cppblog.com/X-LIN/archive/2012/09/16/190913.html</guid><wfw:comment>http://www.cppblog.com/X-LIN/comments/190913.html</wfw:comment><comments>http://www.cppblog.com/X-LIN/archive/2012/09/16/190913.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/X-LIN/comments/commentRss/190913.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/X-LIN/services/trackbacks/190913.html</trackback:ping><description><![CDATA[<p>import java.text.DateFormat;<br />import java.text.SimpleDateFormat;<br />import java.util.Calendar;<br />import java.util.Date;<br />import java.util.Locale;</p>
<p>public class Datetime {</p>
<p>&nbsp;public String getDatetime_String1() {<br />&nbsp;&nbsp;String datetime = new Date().toString();<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime_String2() {<br />&nbsp;&nbsp;String datetime = new Date().toGMTString();<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime_System() {<br />&nbsp;&nbsp;DateFormat dt = DateFormat.getInstance();<br />&nbsp;&nbsp;String datetime = dt.format(new Date()).toString();<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime_China() {<br />&nbsp;&nbsp;DateFormat datetime1 = DateFormat.getDateInstance(DateFormat.LONG,<br />&nbsp;&nbsp;&nbsp;&nbsp;Locale.CHINA);<br />&nbsp;&nbsp;DateFormat datetime2 = DateFormat.getTimeInstance(DateFormat.LONG,<br />&nbsp;&nbsp;&nbsp;&nbsp;Locale.CHINA);<br />&nbsp;&nbsp;String datetime = datetime1.format(new Date()) + " "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ datetime2.format(new Date());<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime_Standard() {<br />&nbsp;&nbsp;Calendar now = Calendar.getInstance();<br />&nbsp;&nbsp;String datetime = now.get(Calendar.YEAR) + "-"<br />&nbsp;&nbsp;&nbsp;&nbsp;+ (now.get(Calendar.MONTH) + 1) + "-"<br />&nbsp;&nbsp;&nbsp;&nbsp;+ now.get(Calendar.DAY_OF_MONTH) + " " + now.get(Calendar.HOUR)<br />&nbsp;&nbsp;&nbsp;&nbsp;+ ":" + now.get(Calendar.MINUTE) + ":"<br />&nbsp;&nbsp;&nbsp;&nbsp;+ now.get(Calendar.SECOND) + now.get(Calendar.MILLISECOND);<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime() {<br />&nbsp;&nbsp;String datetime = new Date().toLocaleString();<br />&nbsp;&nbsp;return datetime;<br />&nbsp;}</p>
<p>&nbsp;public String getDatetime_SimpleDateFormat() {<br />&nbsp;&nbsp;try {<br />&nbsp;&nbsp;&nbsp;SimpleDateFormat f = new java.text.SimpleDateFormat("yyyy-MM-dd");<br />&nbsp;&nbsp;&nbsp;String sDate = f.format(new java.util.Date());<br />&nbsp;&nbsp;&nbsp;java.util.Date dt = f.parse(sDate);<br />&nbsp;&nbsp;&nbsp;java.sql.Date sqlDate = new java.sql.Date(dt.getTime());<br />&nbsp;&nbsp;&nbsp;String datetime = sqlDate.toString();<br />&nbsp;&nbsp;&nbsp;return datetime;<br />&nbsp;&nbsp;} catch (Exception ee) {<br />&nbsp;&nbsp;&nbsp;ee.printStackTrace();<br />&nbsp;&nbsp;&nbsp;return null;<br />&nbsp;&nbsp;}<br />&nbsp;}</p>
<p>&nbsp;public static void main(String[] args) {<br />&nbsp;&nbsp;// TODO 自动生成方法存根<br />&nbsp;&nbsp;System.out.println("以字符串格式显示日期时间: "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ new Datetime().getDatetime_String1());<br />&nbsp;&nbsp;System.out.println("以字符串格式显示日期时间: "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ new Datetime().getDatetime_String2());<br />&nbsp;&nbsp;System.out.println("以系统格式显示日期时间: "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ new Datetime().getDatetime_System());<br />&nbsp;&nbsp;System.out<br />&nbsp;&nbsp;&nbsp;&nbsp;.println("以中国格式显示日期时间: " + new Datetime().getDatetime_China());<br />&nbsp;&nbsp;System.out.println("以常用格式显示日期时间: "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ new Datetime().getDatetime_Standard());<br />&nbsp;&nbsp;System.out.println("以常用格式显示日期时间: " + new Datetime().getDatetime());<br />&nbsp;&nbsp;System.out.println("以简单系统格式显示日期: "<br />&nbsp;&nbsp;&nbsp;&nbsp;+ new Datetime().getDatetime_SimpleDateFormat());<br />&nbsp;}</p>
<p>}</p><img src ="http://www.cppblog.com/X-LIN/aggbug/190913.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/X-LIN/" target="_blank">林</a> 2012-09-16 22:39 <a href="http://www.cppblog.com/X-LIN/archive/2012/09/16/190913.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTree的使用实例</title><link>http://www.cppblog.com/X-LIN/archive/2012/09/05/189618.html</link><dc:creator>林</dc:creator><author>林</author><pubDate>Wed, 05 Sep 2012 15:44:00 GMT</pubDate><guid>http://www.cppblog.com/X-LIN/archive/2012/09/05/189618.html</guid><wfw:comment>http://www.cppblog.com/X-LIN/comments/189618.html</wfw:comment><comments>http://www.cppblog.com/X-LIN/archive/2012/09/05/189618.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/X-LIN/comments/commentRss/189618.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/X-LIN/services/trackbacks/189618.html</trackback:ping><description><![CDATA[<p>import java.awt.Dimension;<br />import java.awt.Color;<br />import javax.swing.JFrame;<br />import javax.swing.JPanel;<br />import javax.swing.JScrollPane;<br />import javax.swing.JTree;<br />import javax.swing.BoxLayout;<br />import javax.swing.tree.TreePath;<br />import javax.swing.tree.DefaultMutableTreeNode;<br />import javax.swing.tree.DefaultTreeModel;</p>
<p>/* <br />&nbsp;JTree的构造函数:<br />&nbsp;JTree()<br />&nbsp;JTree(Hashtable value)<br />&nbsp;JTree(Object[] value)//只有这个构造函数可以创建多个根结点<br />&nbsp;JTree(TreeModel newModel)<br />&nbsp;JTree(TreeNode root)<br />&nbsp;JTree(TreeNode root, boolean asksAllowsChildren)<br />&nbsp;JTree(Vector value)</p>
<p>&nbsp;*/<br />public class JTreeDemo {<br />&nbsp;public static void main(String[] args) {</p>
<p>&nbsp;&nbsp;// 构造函数：JTree()<br />&nbsp;&nbsp;JTree example1 = new JTree();</p>
<p>&nbsp;&nbsp;// 构造函数：JTree(Object[] value)<br />&nbsp;&nbsp;Object[] letters = { " a ", " b ", " c ", " d ", " e " };<br />&nbsp;&nbsp;JTree example2 = new JTree(letters);</p>
<p>&nbsp;&nbsp;// 构造函数：JTree(TreeNode root)(TreeNode空)<br />&nbsp;&nbsp;// 用空结点创建树<br />&nbsp;&nbsp;DefaultMutableTreeNode node1 = new DefaultMutableTreeNode(); // 定义树结点<br />&nbsp;&nbsp;JTree example3 = new JTree(node1); // 用此树结点做参数调用 JTree的构造函数创建含有一个根结点的树</p>
<p>&nbsp;&nbsp;// 构造函数：JTree(TreeNode root)(同上,只是TreeNode非空)<br />&nbsp;&nbsp;// 用一个根结点创建树<br />&nbsp;&nbsp;DefaultMutableTreeNode node2 = new DefaultMutableTreeNode(" Color ");<br />&nbsp;&nbsp;JTree example4 = new JTree(node2); // 结点不可以颜色,默认为白面黑字<br />&nbsp;&nbsp;example4.setBackground(Color.lightGray);</p>
<p>&nbsp;&nbsp;// 构造函数：JTree(TreeNode root, boolean<br />&nbsp;&nbsp;// asksAllowsChildren)(同上,只是TreeNode又有不同)<br />&nbsp;&nbsp;// 使用DefaultMutableTreeNode类先用一个根结点创建树，设置为可添加孩子结点,再添加孩子结点<br />&nbsp;&nbsp;DefaultMutableTreeNode color = new DefaultMutableTreeNode(" Color ",<br />&nbsp;&nbsp;&nbsp;&nbsp;true);<br />&nbsp;&nbsp;DefaultMutableTreeNode gray = new DefaultMutableTreeNode(" Gray ");<br />&nbsp;&nbsp;color.add(gray);<br />&nbsp;&nbsp;color.add(new DefaultMutableTreeNode(" Red "));<br />&nbsp;&nbsp;gray.add(new DefaultMutableTreeNode(" Lightgray "));<br />&nbsp;&nbsp;gray.add(new DefaultMutableTreeNode(" Darkgray "));<br />&nbsp;&nbsp;color.add(new DefaultMutableTreeNode(" Green "));<br />&nbsp;&nbsp;JTree example5 = new JTree(color);</p>
<p>&nbsp;&nbsp;// 构造函数：JTree(TreeNode root)(同上,只是TreeNode非空)<br />&nbsp;&nbsp;// 通过逐个添加结点创建树<br />&nbsp;&nbsp;DefaultMutableTreeNode biology = new DefaultMutableTreeNode(" Biology ");<br />&nbsp;&nbsp;DefaultMutableTreeNode animal = new DefaultMutableTreeNode(" Animal ");<br />&nbsp;&nbsp;DefaultMutableTreeNode mammal = new DefaultMutableTreeNode(" Mammal ");<br />&nbsp;&nbsp;DefaultMutableTreeNode horse = new DefaultMutableTreeNode(" Horse ");<br />&nbsp;&nbsp;mammal.add(horse);<br />&nbsp;&nbsp;animal.add(mammal);<br />&nbsp;&nbsp;biology.add(animal);<br />&nbsp;&nbsp;JTree example6 = new JTree(biology);<br />&nbsp;&nbsp;horse.isLeaf();<br />&nbsp;&nbsp;horse.isRoot();</p>
<p>&nbsp;&nbsp;// 构造函数:JTree(TreeModel newModel)<br />&nbsp;&nbsp;// 用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode<br />&nbsp;&nbsp;// 创建一个树的模型,再用JTree的构造函数创建一个树</p>
<p>&nbsp;&nbsp;DefaultMutableTreeNode root = new DefaultMutableTreeNode(" Root1 ");<br />&nbsp;&nbsp;DefaultMutableTreeNode child1 = new DefaultMutableTreeNode(" Child1 ");<br />&nbsp;&nbsp;DefaultMutableTreeNode child11 = new DefaultMutableTreeNode(" Child11 ");<br />&nbsp;&nbsp;DefaultMutableTreeNode child111 = new DefaultMutableTreeNode(<br />&nbsp;&nbsp;&nbsp;&nbsp;" Child111 ");<br />&nbsp;&nbsp;root.add(child1);<br />&nbsp;&nbsp;child1.add(child11);<br />&nbsp;&nbsp;child11.add(child111);</p>
<p>&nbsp;&nbsp;DefaultTreeModel model = new DefaultTreeModel(root);</p>
<p>&nbsp;&nbsp;JTree example7 = new JTree(model);</p>
<p>&nbsp;&nbsp;JPanel panel = new JPanel();<br />&nbsp;&nbsp;panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));<br />&nbsp;&nbsp;panel.setPreferredSize(new Dimension(700, 400));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example1)); // JTree必须放在JScrollPane上<br />&nbsp;&nbsp;panel.add(new JScrollPane(example2));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example3));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example4));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example5));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example6));<br />&nbsp;&nbsp;panel.add(new JScrollPane(example7));</p>
<p>&nbsp;&nbsp;JFrame frame = new JFrame(" JTreeDemo ");<br />&nbsp;&nbsp;frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />&nbsp;&nbsp;frame.setContentPane(panel);<br />&nbsp;&nbsp;frame.pack();<br />&nbsp;&nbsp;frame.show();<br />&nbsp;}<br />}</p><img src ="http://www.cppblog.com/X-LIN/aggbug/189618.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/X-LIN/" target="_blank">林</a> 2012-09-05 23:44 <a href="http://www.cppblog.com/X-LIN/archive/2012/09/05/189618.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java 创建树形列表</title><link>http://www.cppblog.com/X-LIN/archive/2012/09/04/189385.html</link><dc:creator>林</dc:creator><author>林</author><pubDate>Tue, 04 Sep 2012 02:27:00 GMT</pubDate><guid>http://www.cppblog.com/X-LIN/archive/2012/09/04/189385.html</guid><wfw:comment>http://www.cppblog.com/X-LIN/comments/189385.html</wfw:comment><comments>http://www.cppblog.com/X-LIN/archive/2012/09/04/189385.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/X-LIN/comments/commentRss/189385.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/X-LIN/services/trackbacks/189385.html</trackback:ping><description><![CDATA[<p>import javax.swing.JEditorPane;<br />import javax.swing.JFrame;<br />import javax.swing.JPanel;<br />import javax.swing.JScrollPane;<br />import javax.swing.JSplitPane;<br />import javax.swing.UIManager;</p>
<p>import javax.swing.JTree;<br />import javax.swing.tree.DefaultMutableTreeNode;<br />import javax.swing.tree.TreeSelectionModel;<br />import javax.swing.event.TreeSelectionEvent;<br />import javax.swing.event.TreeSelectionListener;</p>
<p>import java.net.URL;<br />import java.io.IOException;<br />import java.awt.Dimension;<br />import java.awt.GridLayout;</p>
<p>public class TreeDemo extends JPanel<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; implements TreeSelectionListener {<br />&nbsp;&nbsp;&nbsp; private JEditorPane htmlPane;<br />&nbsp;&nbsp;&nbsp; private JTree tree;<br />&nbsp;&nbsp;&nbsp; private URL helpURL;<br />&nbsp;&nbsp;&nbsp; private static boolean DEBUG = false;</p>
<p>&nbsp;&nbsp;&nbsp; //Optionally play with line styles.&nbsp; Possible values are<br />&nbsp;&nbsp;&nbsp; //"Angled" (the default), "Horizontal", and "None".<br />&nbsp;&nbsp;&nbsp; private static boolean playWithLineStyle = false;<br />&nbsp;&nbsp;&nbsp; private static String lineStyle = "Horizontal";<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; //Optionally set the look and feel.<br />&nbsp;&nbsp;&nbsp; private static boolean useSystemLookAndFeel = false;</p>
<p>&nbsp;&nbsp;&nbsp; public TreeDemo() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; super(new GridLayout(1,0));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create the nodes.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultMutableTreeNode top =<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new DefaultMutableTreeNode("The Java Series");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createNodes(top);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create a tree that allows one selection at a time.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree = new JTree(top);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.getSelectionModel().setSelectionMode<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (TreeSelectionModel.SINGLE_TREE_SELECTION);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Listen for when the selection changes.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.addTreeSelectionListener(this);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (playWithLineStyle) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("line style = " + lineStyle);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.putClientProperty("JTree.lineStyle", lineStyle);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create the scroll pane and add the tree to it. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JScrollPane treeView = new JScrollPane(tree);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create the HTML viewing pane.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htmlPane = new JEditorPane();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htmlPane.setEditable(false);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initHelp();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JScrollPane htmlView = new JScrollPane(htmlPane);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Add the scroll panes to a split pane.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitPane.setTopComponent(treeView);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitPane.setBottomComponent(htmlView);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Dimension minimumSize = new Dimension(100, 50);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htmlView.setMinimumSize(minimumSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; treeView.setMinimumSize(minimumSize);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitPane.setDividerLocation(100); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; splitPane.setPreferredSize(new Dimension(500, 300));</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Add the split pane to this panel.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add(splitPane);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; /** Required by TreeSelectionListener interface. */<br />&nbsp;&nbsp;&nbsp; public void valueChanged(TreeSelectionEvent e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultMutableTreeNode node = (DefaultMutableTreeNode)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.getLastSelectedPathComponent();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node == null) return;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Object nodeInfo = node.getUserObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node.isLeaf()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BookInfo book = (BookInfo)nodeInfo;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayURL(book.bookURL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (DEBUG) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.print(book.bookURL + ":&nbsp; \n&nbsp;&nbsp;&nbsp; ");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayURL(helpURL); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (DEBUG) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println(nodeInfo.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private class BookInfo {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String bookName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public URL bookURL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public BookInfo(String book, String filename) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookName = book;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bookURL = getClass().getResource(filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bookURL == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Couldn't find file: "<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; + filename);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public String toString() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return bookName;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void initHelp() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String s = "TreeDemoHelp.html";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; helpURL = getClass().getResource(s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (helpURL == null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Couldn't open help file: " + s);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else if (DEBUG) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Help URL is " + helpURL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; displayURL(helpURL);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void displayURL(URL url) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (url != null) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; htmlPane.setPage(url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else { //null url<br />&nbsp;&nbsp;htmlPane.setText("File Not Found");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (DEBUG) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.out.println("Attempted to display a null URL.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (IOException e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Attempted to read a bad URL: " + url);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; private void createNodes(DefaultMutableTreeNode top) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultMutableTreeNode category = null;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DefaultMutableTreeNode book = null;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category = new DefaultMutableTreeNode("Books for Java Programmers");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top.add(category);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //original Tutorial<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Tutorial: A Short Course on the Basics",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "tutorial.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Tutorial Continued<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Tutorial Continued: The Rest of the JDK",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "tutorialcont.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //JFC Swing Tutorial<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The JFC Swing Tutorial: A Guide to Constructing GUIs",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "swingtutorial.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Bloch<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("Effective Java Programming Language Guide",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "bloch.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Arnold/Gosling<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Programming Language", "arnold.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Chan<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Developers Almanac",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "chan.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category = new DefaultMutableTreeNode("Books for Java Implementers");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; top.add(category);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //VM<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Virtual Machine Specification",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "vm.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Language Spec<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; book = new DefaultMutableTreeNode(new BookInfo<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ("The Java Language Specification",<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "jls.html"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; category.add(book);<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; /**<br />&nbsp;&nbsp;&nbsp;&nbsp; * Create the GUI and show it.&nbsp; For thread safety,<br />&nbsp;&nbsp;&nbsp;&nbsp; * this method should be invoked from the<br />&nbsp;&nbsp;&nbsp;&nbsp; * event dispatch thread.<br />&nbsp;&nbsp;&nbsp;&nbsp; */<br />&nbsp;&nbsp;&nbsp; private static void createAndShowGUI() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (useSystemLookAndFeel) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIManager.setLookAndFeel(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; UIManager.getSystemLookAndFeelClassName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println("Couldn't use system look and feel.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Create and set up the window.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame frame = new JFrame("TreeDemo");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Add content to the window.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.add(new TreeDemo());</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Display the window.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.pack();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame.setVisible(true);<br />&nbsp;&nbsp;&nbsp; }</p>
<p>&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Schedule a job for the event dispatch thread:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //creating and showing this application's GUI.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; javax.swing.SwingUtilities.invokeLater(new Runnable() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void run() {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; createAndShowGUI();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />&nbsp;&nbsp;&nbsp; }<br />}<br /></p><img src ="http://www.cppblog.com/X-LIN/aggbug/189385.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/X-LIN/" target="_blank">林</a> 2012-09-04 10:27 <a href="http://www.cppblog.com/X-LIN/archive/2012/09/04/189385.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置插入ImageIcon图片的指定大小</title><link>http://www.cppblog.com/X-LIN/archive/2012/09/04/189367.html</link><dc:creator>林</dc:creator><author>林</author><pubDate>Tue, 04 Sep 2012 01:16:00 GMT</pubDate><guid>http://www.cppblog.com/X-LIN/archive/2012/09/04/189367.html</guid><wfw:comment>http://www.cppblog.com/X-LIN/comments/189367.html</wfw:comment><comments>http://www.cppblog.com/X-LIN/archive/2012/09/04/189367.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/X-LIN/comments/commentRss/189367.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/X-LIN/services/trackbacks/189367.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 可以用Image中的getScaledInstance方法得到一个按照指定宽度和高度缩放以后的Image实例，然后再用setImage方法设置ImageIcon所显示的图像。<br />private final static int WIDTH=147;<br />private final static int HEIGHT=136;<br /><br />img=new ImageIcon("1.png");<br />img.setImage(img.getImage().getScaledInstance(test.WIDTH,test.HEIGHT,Image.SCALE_DEFAULT));<br />&nbsp;&nbsp;<br />showImg=new JLabel();<br />showImg.setIcon(img);<br /> <img src ="http://www.cppblog.com/X-LIN/aggbug/189367.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/X-LIN/" target="_blank">林</a> 2012-09-04 09:16 <a href="http://www.cppblog.com/X-LIN/archive/2012/09/04/189367.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>