﻿<?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>BlogJava-java something-随笔分类-swing</title><link>http://www.blogjava.net/santicom/category/47772.html</link><description>不要以为......很遥远</description><language>zh-cn</language><lastBuildDate>Thu, 01 Sep 2011 21:29:42 GMT</lastBuildDate><pubDate>Thu, 01 Sep 2011 21:29:42 GMT</pubDate><ttl>60</ttl><item><title>Jree</title><link>http://www.blogjava.net/santicom/archive/2011/03/23/346804.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Wed, 23 Mar 2011 01:09:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/03/23/346804.html</guid><description><![CDATA[树控件很适合用来显示，导航和编辑结构化对象；但是JTree很复杂，swing中有整个一个包都是针对它的（javax.swing.tree），注意树控件是显示的，但是树数据结构是一种集合接口的实现，就如同JList和java.util.List一样，他们应用在不同层，当然你使用Jlist来显示List接口的实现者那是很般配的。<br />
*<br />
**<br />
关于树的术语如根，节点，叶子，深度，路径，平衡性，边，子树；不需要我这里过多的解释，任何一本数据结构的书籍都会介绍他们。我这里主要是讲述树控件。
<p>树遍历这个概念先提一下：遍历即逐个访问，对于树而言主要有三种：前序，后序，中序遍历树的每个节点。遍历一般是用递归算法来实现的，三种遍历法区别于先访问树的那个部分。树遍历也是比较难的一个技术，不好掌握，我在大学时用汇编实现过这三种算法，到现在还记忆犹新（完全自己找到的规律），一下来和朋友们分享一下。<br />
对于一个有两个子节点的树（或多个子节点），请你沿着树的外围画一个轮廓线：</p>
<p>&nbsp;</p>
<p>———&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &gt;——————<br />
&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<br />
&nbsp;&nbsp;&nbsp;&nbsp; /_____&gt;____\&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这是大致绕树行走的轮廓线，大家都知道（或许你还不知道）函数的调用时控制流的传递就是这个样子的。（控制流是线程执行方法时的形象表述）比如一下函数： main(){</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; f1();<br />
&nbsp;&nbsp;&nbsp;&nbsp; f2();<br />
}//该函数的控制流向是：先传给main，再由main（）传给f1,之后退回到mian（），在传给f2()在由f2退回给main之后结束程序。异步方法调用时才会从这个封闭的轮廓中分出一个分支来。现在来谈你如何设计一个树遍历方法：<br />
我们来看一个函数的几个关键部位， <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; func（）{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; entry入口处<br />
&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return出口处&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }也许你很迷惑这与树遍历算法有和关系，告诉你吧这三个特殊部位就是你在设计递归时，递归函数应该出现的位置，他们出现在不同的位置就是不同的&#8220;序&#8221;,伪码如：<br />
先序遍历<br />
traversTree(Node root){<br />
&nbsp;&nbsp; if(root !=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(root.isLeaf()){//当是叶子时，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visit（root）;//前序遍历是先遍历页节点<br />
&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Node[] children=root.getChildren();//获取所有子树 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Node n:children){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; traversTree(n);//递归遍历所有子树，注意子树可能为空。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
<p>}</p>
<p>中序遍历（亦称广度优先遍历，总是先遍历树的根）</p>
<p>traversTree(Node root){<br />
&nbsp;&nbsp; if(root !=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; //树非空<br />
&nbsp;&nbsp;&nbsp;&nbsp; visit(root); //这是中序遍历 visit出现与递归函数之前。<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; Node[] children=root.getChildren();//获取所有子树 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Node n:children){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; traversTree(n);//递归遍历所有子树，注意子树可能为空。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
<p>}</p>
<p>后序遍历（亦称深度优先搜索）：<br />
traversTree(Node root){<br />
&nbsp;&nbsp; if(root !=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; Node[] children=root.getChildren();//获取所有子树 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(Node n:children){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; traversTree(n);//递归遍历所有子树，注意子树可能为空。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; visit(root); //这是后序遍历 visit出现在递归函数之后。<br />
&nbsp;&nbsp; }</p>
<p>}</p>
<p>以上三个算法，可能有点不正确，我没测试过，时间太久了有点忘了，总之为大家做个参考吧！<br />
因为树结构典型的是应用了组合设计模式，所以只要涉及到树肯定涉及遍历，和递归。所以这里罗嗦一下。&nbsp;&nbsp; 所有的树都是节点&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
**<br />
***<br />
swing中Jtree处理树结构是通过树模型接口，它实现了TreeNode接口（在api文档中竟看不到此信息！），DefaultMutableTreeNode类实现了TreeNode接口，并提供了前,中,后序的树遍历能力。<br />
JTree图形化的显示了树结构的每一个节点，所有的UI控件都有两个目的，显示和输入（输入包括数据的输入如JTextField和命令输入如菜单，按钮等），JTree既可以用于树结构的显示，也可以用于命令的输入，或使得我们编辑树节点。<br />
树节点可以被选中，它由TreeSelectionModel来控制，选择涉及到维护作为TreeNode实例的树节点间的路径轨迹。树控件典型的可以激发两类事件：TreeModelEvent和TreeExpansionEvent，当然其他Awt和Swing事件也可由树控件激发（看其继承层次结构即可知）比如MouseListener可用来截取鼠标事件。JTree扩展了Scrollable接口，可被放在一个滚动面板中。</p>
<p>JTree的构造：可使用默认的构造方法，提供一个TreeNode作为其根节点，提供一个TreeModel包含所有其它的节点，或提供一个一维数组，向量，或对象的哈希表，对于这些集合中的单个元素，如果它又是一个集合，那么他们会被解释显示为子树，该功能由JTree的内部类DynamicUtilTreeNode完成。<br />
***<br />
****<br />
TreeModel接口：<br />
该接口的实现者为JTree提供显示的数据，如果你熟悉MVC模式，你应该明白所有的swing或awt控件中模型的作用就是为相应的控件提供数据。当模型的数据结构有所变化时它会通知视图（这里就是JTree）来更新显示。当然模型也可以添加其他的监听器如Jtree的addTreeModelListener，你可以实现该监听器，来使你自己的类接收模型变化给你的通知。如果你不熟悉MVC模式，请参考POSA卷一或其他资料，顺便提一下在我们学校GUI时都知道有MVC模式的应用，往往不知道那个Controller是什么类，其实就是视图的监听器，比如ActionListener，注意别被众多的监听器弄昏了，一类是模型需要添加的，一类是视图（比如JComponent的子类）需要添加的。控制的流向或数据的流向是相反的，视图需要添加的监听器（我们常常实现他们）才是控制器。</p>
<p>因为模型和视图都能够触发事件，比如视图（JTree等控件）是触发用户输入导致的事件，而模型触发的事件是因为模型中维护的数据有所变动才触发的（比如，树模型中树节点的增删，改，或树路径的变动）。而他们都使用了观察者模式，算了不多说了，到时全弄成模式了，会搞昏大家的。继续....</p>
<p>JTree的setModel和getModel方法是用来更换/设置和获取模型的方法。你可替换现有JTree的模型，或者你想这样用，两个模型，一个用，一个备。如果构造模型复杂耗时的话，先在后台构造好一个在换掉原先的。就如同双缓冲技术的思路那样。<br />
****<br />
*****<br />
杂项：<br />
DefultTreeModel是对TreeModel接口的默认实现类，<br />
TreeNode接口可告诉你改实现者是否为一个叶子，一个父节点等。MutalbeTreeNode接口扩展了TreeNode接口，我们可在该实现者中存放一个我们自己的类实例（setUserObject（）/getUserObject）;<br />
defaultMutableTreeNode 实现了MutableTreeNode接口，children()方法返回以一维向量形式存放的直接子节点的枚举，也可以使用getChildAt()返回特定索引位置的子节点（注意子节点完全可以是一颗子树）该类提供了前中后序访问树的能力：preorderEnumeration()，,breadthFirstEnumeration()，depthFirstEnumeration(）postorderEnumeration()最后两个方法同行为，只不过是不同的称号而已。</p>
<p>TreePath：该类用一系列节点表示一个从树根到一个节点的路径，它是只读的，提供与其他路径比较的能力。<br />
TreeCellRenderrer接口：渲染tree的一个单元的组件，我们自己实现该接口并用jtree的setCellRenderer（）方法替换原先的渲染器，可以是树节点在选中，获取焦点，不同的树状态（叶子或父节点，展开，或收缩）等不同的状态下的外观。<br />
DefaultTreeCellRenderer类是TreeCellRenderrer接口的默认实现，它扩展了JLabel，并基于以上描述的树状态来渲染树节点，其提供的属性包括图标，背景色，前景色等，其get和set方法是我们可以访问的，通过这些方法你当然可以换掉树节点的图标了。</p>
<p>CellEditor接口：定义了控制何时编辑将开始，结束，提取一个新的结果，是否编辑请求改变当前组件的选择，请参考API文档看该接口的方法。该接口在JTree和JTable中都有用到。，该接口也可以添加监听器，当编辑停止或取消时会激发ChangeEvents到其所有的注册处理器哪里。<br />
TreeCellEditor接口扩展了CellEditor接口，jtree的setCellEditor()使得我们可以用任何一个可充当编辑器的组件替换掉原来的那个。DefaultCellEditor实现了该接口，这个编辑器允许使用JTextField，JComboBox或是JCheckBox组件来编辑数据，其保护的内部类EditorDelegate会响应getCellEditorValue（）方法把当前值返回。DefaultCellEditor仅基于以上三个J控件作为编辑器，其clickCountToStart方法决定鼠标单击几次会触发编辑。默认对于JTextField是两次，JComboBox和JCheckBox是一次，changeEvents会在stopCellEditing（）和cancelCellEditing（）时激发。<br />
DefaultTreeCellEditor扩展了DefaultCellEditor类并且是TreeCellEditor的默认实现类，他使用JTextField来编辑节点数据，在键入ENTER键后stopCellEditing（）会被调用。对于树节点的编辑我们可添加自己的时间监听器来处理他们。默认时编辑开始于节点被单击三次或两次（时间间隔在内部会用一个定时器来决定），也可以改变他们的数目setClickCountToStart()；<br />
JTree的选择是基于行和树路径的，我们可以选择使用那个。</p>
<p>TreeSelectionModel接口用于树选择模型，支持三种选择，SINGLE_TREE_SELECTION，<br />
DISCONTIGUOUS_TREE_SELECTION，CONTIGUOUS_TREE_SELECTION，set/getSelectionMode()可以访选择模型。getSelectionPath『s』()会返回一个当前选中的树路径。DefaultTreeSelectionModel默认实现了该接口，该类提供TreeSelectionlistener通知，当树路径选择发生变化时。</p>
<p>TreeModelListener实现者可以侦听模型变化，TreeSelectionListener用来侦听视图JTree的selection（仅有一个方法valueChanged(TreeSlectcionEvent tsEvt)）;<br />
TreeExpansionListener用来对树展开收缩进行处理。<br />
TreeW illExpandListener在树&#8220;将要&#8221;展开和收缩时得到通知，你可截获处理，ExpandVetoException异常如果抛出，那么树不会展开和收缩。</p>
<p>TreeModelEvent，用来通知模型的监听器，JTree的数据部分或全部发生了变化。该事件对象封装了源组件的引用，封装了一个TreePath或一个用来表示路径的数组。<br />
TreeselectionEvent，视图会用其通知所有视图监听器TreeSelectionListeners，选择发生了变化。<br />
TreeExpansionEvent，用来封装相应最近或可能展开或收缩的TreePath，使用getPath()方法访问树路径。<br />
ExpandVetoException异常可由TreeWillExpandListener抛出，来否决树路径的展开和收缩。</p>
<p>JTree提供的现成方便的UI属性：<br />
myJTree.putClientProperty("JTree.lineStyle", "Angled");//更改线型。<br />
如同其他Swing组件，我们也可以改变默认的用于JTree的ＵＩ资源（全局性的）：<br />
UIManager.put("Tree.hash",<br />
new ColorUIResource(Color.lightGray));／／改变渲染节点间edges边的颜色。<br />
UIManager.put("Tree.openIcon", new IconUIResource(<br />
new ImageIcon("myOpenIcon.gif")));//改变一个打开的树节点的图标。同理可用于其它情况：Tree.leafIcon, Tree.expandedIcon，和Tree.closedIcon， Tree.collapsedIcon。</p>
<p>其他控制TreeＵＩ显示的方法：<br />
myTree.setRowHeight()／／控制树节点的行高，<br />
JTree的UI委托也提供了更改树外观的方法（相比于ＵＩＭａｎａｇｅｒ的方法，这里是局部的）。<br />
BasicTreeUI basicTreeUI = (BasicTreeUI) myJTree.getUI();<br />
basicTreeUI.setRightChildIndent(10);<br />
basicTreeUI.setLeftChildIndent(8);</p>
<p><br />
以上简要提及了ＪＴｒｅｅ的方方面面,许多的事件，将听器模型，请仔细分析，一定要分清哪些是针对模型的那些是针对视图的。</p>
<p>*****<br />
******<br />
简单的示例，我这里仅用到了最简单的树构造方法，和一个监听器，在<br />
以后我的自学过程中，我会继续试用其他的JTree知识，我的JTree学习<br />
最终都是想实现那个ＧＵＩ上的授权控制系统，请参考其他篇章，<br />
至于这里用到的LAndFSysMenu类，在我的其他篇章中有该类的实现。<br />
package jTreeDemo;</p>
<p>import java.awt.Container;<br />
import javax.swing.*;<br />
import javax.swing.event.TreeSelectionEvent;<br />
import javax.swing.event.TreeSelectionListener;<br />
import lookAndFeelSys.*;<br />
import userInterfaces.UIUtil;<br />
import java.awt.*;<br />
import java.util.Hashtable;<br />
import java.util.Vector;<br />
import javax.swing.tree.*;</p>
<p><br />
public class JTreeTest extends JFrame{</p>
<p>public static void main(String[] args){<br />
new JTreeTest("测试"); <br />
}<br />
<br />
public JTreeTest(String title){<br />
&nbsp;&nbsp; super(title);<br />
&nbsp;&nbsp; biuldFrame();<br />
}</p>
<p>&nbsp;&nbsp; private void biuldFrame(){<br />
&nbsp;&nbsp;&nbsp; JMenuBar jmb=new JMenuBar();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; JMenu jm=new LAndFSysMenu();<br />
&nbsp;&nbsp;&nbsp; //JMenu jm=new JMenu("hello");<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; jmb.add(jm);<br />
&nbsp;&nbsp;&nbsp; this.setJMenuBar(jmb);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; buildFrmContent();&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; UIUtil.SetComponentDimension(this,0.5,0.6);<br />
&nbsp;&nbsp;&nbsp; UIUtil.SetComponentToCenterOfScreen(this);<br />
&nbsp;&nbsp;&nbsp; this.setVisible(true);<br />
&nbsp;&nbsp;&nbsp; this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; private void buildFrmContent(){<br />
&nbsp;&nbsp;&nbsp; Container root_c=this.getContentPane();<br />
&nbsp;&nbsp;&nbsp; JTabbedPane jtp=new JTabbedPane();<br />
&nbsp;&nbsp;&nbsp; Container c = new JPanel();<br />
&nbsp;&nbsp;&nbsp; jtp.addTab("静态树组件练习",c );<br />
&nbsp;&nbsp;&nbsp; jtp.addTab("事件监听",this.treeDemo2());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
&nbsp;&nbsp; root_c.add(jtp); <br />
<br />
c.setLayout(new GridLayout(2,4));<br />
JScrollPane jsp_1=new JScrollPane();<br />
JScrollPane jsp_2=new JScrollPane();<br />
JScrollPane jsp_3=new JScrollPane();<br />
JScrollPane jsp_4=new JScrollPane();<br />
<br />
<br />
/*为JTree准备显示的模型*/<br />
Object[] m1=new String[]{"节点1","节点2","节点3"};<br />
Object[] m2=new String[][]{<br />
&nbsp;&nbsp;&nbsp; {"1.1","1.2","1.3"},<br />
&nbsp;&nbsp;&nbsp; {"2.1","2.2","2.3"},<br />
&nbsp;&nbsp;&nbsp; {"3.1","3.2","3.3"}<br />
};<br />
Vector&lt;Object&gt; m3=new Vector&lt;Object&gt;();<br />
m3.add("1");<br />
m3.add("2");<br />
m3.add(m1);<br />
m3.add(m2);<br />
Hashtable&lt;String,Object&gt; m4=new Hashtable&lt;String,Object&gt;();<br />
m4.put("子一","叶子");<br />
m4.put("子二", m1);<br />
m4.put("子三",m3);<br />
<br />
<br />
JTree jtr_1=new JTree(m1);<br />
jsp_1.getViewport().add(jtr_1);<br />
JTree jtr_2=new JTree(m2);<br />
jsp_2.getViewport().add(jtr_2);<br />
JTree jtr_3=new JTree(m3);<br />
jsp_3.getViewport().add(jtr_3);<br />
JTree jtr_4=new JTree(m4);<br />
jsp_4.getViewport().add(jtr_4);<br />
<br />
<br />
c.add(jsp_1);<br />
c.add(jsp_2);<br />
c.add(jsp_3);<br />
c.add(jsp_4);<br />
<br />
/*jsp_1.getViewport().add(jtr_1);<br />
c.add(jsp_1);*/<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; /*&lt;&lt;&nbsp;&nbsp;&nbsp;&nbsp; 另一组JTree实例：*/<br />
&nbsp;&nbsp; private JPanel treeDemo2(){<br />
&nbsp;&nbsp;&nbsp; JPanel rsltPanel=new JPanel();<br />
&nbsp;&nbsp;&nbsp; rsltPanel.setLayout(new BorderLayout());<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; JLabel jl_msg=new JLabel("此标签用来显示树选择情况");<br />
&nbsp;&nbsp;&nbsp; JScrollPane jsp_1=new JScrollPane();<br />
&nbsp;&nbsp;&nbsp; Object[] m=new String[]{"节点1","节点2","节点3"};<br />
&nbsp;&nbsp;&nbsp; JTree jtr=new JTree(m);<br />
&nbsp;&nbsp;&nbsp; jtr.getSelectionModel()<br />
&nbsp;&nbsp;&nbsp; .addTreeSelectionListener(new MySelectionLstnr(<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jl_msg));<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; jsp_1.getViewport().add(jtr);<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; rsltPanel.add(jsp_1,BorderLayout.CENTER);<br />
&nbsp;&nbsp;&nbsp; rsltPanel.add(jl_msg,BorderLayout.SOUTH);<br />
&nbsp;&nbsp;&nbsp; return rsltPanel;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; class MySelectionLstnr implements TreeSelectionListener{<br />
&nbsp;&nbsp;&nbsp; //该内部类实现树监听器，在树被选中后将选中的节点<br />
&nbsp;&nbsp;&nbsp; //信息打印到一个Label上<br />
&nbsp;&nbsp;&nbsp; private JLabel jl_msg=null;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public MySelectionLstnr(JLabel msgLabel){<br />
&nbsp;&nbsp;&nbsp; this.jl_msg=msgLabel;<br />
&nbsp;&nbsp;&nbsp; }<br />
@Override<br />
public void valueChanged(TreeSelectionEvent e) {<br />
&nbsp;&nbsp; // 凡是树选择的处理都涉及到树路径的处理：<br />
&nbsp;&nbsp; TreePath path = e.getPath();<br />
&nbsp;&nbsp; Object[] nodes = path.getPath();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp; //当前选中的节点是树路径上最后一个节点<br />
&nbsp;&nbsp;&nbsp;&nbsp; Object selectedNode=nodes[nodes.length-1 ];<br />
&nbsp;&nbsp;&nbsp;&nbsp; if(this.jl_msg!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp; this.jl_msg.setText("选中的节点上的文本是："+<br />
&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; selectedNode.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; /*另一组JTree实例：&gt;&gt;*/<br />
}</p>
<p>&nbsp;</p>
<div align="center" forimg="1"><img class="blogimg" src="http://hiphotos.baidu.com/yiqing95/pic/item/79929c8bc6645bf2fc1f1060.jpg" border="0" small="0"  alt="" /></div>
<p>******<br />
参考Java Swing （Manning出版社）swing hack （orelly出版社）。 <br />
</p>
<img src ="http://www.blogjava.net/santicom/aggbug/346804.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-03-23 09:09 <a href="http://www.blogjava.net/santicom/archive/2011/03/23/346804.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTree用法</title><link>http://www.blogjava.net/santicom/archive/2011/03/23/346796.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Wed, 23 Mar 2011 00:32:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/03/23/346796.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/346796.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/03/23/346796.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/346796.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/346796.html</trackback:ping><description><![CDATA[<span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;java.awt.Dimension;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;java.awt.Color;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.JFrame;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.JPanel;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.JScrollPane;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.JTree;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.BoxLayout;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.tree.TreePath;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.tree.DefaultMutableTreeNode;<br />
</span><span style="color: rgb(0,0,255)">import</span> <span style="color: rgb(0,0,0)">&nbsp;javax.swing.tree.DefaultTreeModel;<br />
</span><span style="color: rgb(0,128,0)">/*</span> <span style="color: rgb(0,128,0)"><br />
JTree的构造函数:<br />
JTree()<br />
JTree(Hashtable&nbsp;value)<br />
JTree(Object[]&nbsp;value)//只有这个构造函数可以创建多个根结点<br />
JTree(TreeModel&nbsp;newModel)<br />
JTree(TreeNode&nbsp;root)<br />
JTree(TreeNode&nbsp;root,&nbsp;boolean&nbsp;asksAllowsChildren)<br />
JTree(Vector&nbsp;value)<br />
<br />
</span><span style="color: rgb(0,128,0)">*/</span> <span style="color: rgb(0,0,0)"><br />
</span><span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">class</span> <span style="color: rgb(0,0,0)">&nbsp;JTreeDemo<br />
{<br />
&nbsp;</span> <span style="color: rgb(0,0,255)">public</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">static</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">void</span> <span style="color: rgb(0,0,0)">&nbsp;main&nbsp;(String[]&nbsp;args)<br />
&nbsp;{<br />
<br />
<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree()</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;JTree&nbsp;example1&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree();<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree(Object[]&nbsp;value)</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;Object[]&nbsp;letters</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;{</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">a</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">b</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">c</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">d</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">e</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">};<br />
&nbsp;&nbsp;JTree&nbsp;example2&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(letters);<br />
<br />
&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree(TreeNode&nbsp;root)(TreeNode空)<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">用空结点创建树</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;node1&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode();</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">定义树结点</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;JTree&nbsp;example3&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(node1);</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">用此树结点做参数调用&nbsp;JTree的构造函数创建含有一个根结点的树<br />
<br />
&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree(TreeNode&nbsp;root)(同上,只是TreeNode非空)<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">用一个根结点创建树</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;node2&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Color</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;JTree&nbsp;example4&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(node2);</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">结点不可以颜色,默认为白面黑字</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;example4.setBackground&nbsp;(Color.lightGray);<br />
<br />
&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree(TreeNode&nbsp;root,&nbsp;boolean&nbsp;asksAllowsChildren)(同上,只是TreeNode又有不同)<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">使用DefaultMutableTreeNode类先用一个根结点创建树，设置为可添加孩子结点,再添加孩子结点</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;color&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Color</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,255)">true</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;gray&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Gray</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;color.add&nbsp;(gray);<br />
&nbsp;&nbsp;color.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Red</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;gray.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Lightgray</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;gray.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Darkgray</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;color.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Green</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;JTree&nbsp;example5&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(color);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数：JTree(TreeNode&nbsp;root)(同上,只是TreeNode非空)<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">通过逐个添加结点创建树</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;biology&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Biology</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;animal&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Animal</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;mammal&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Mammal</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;horse&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Horse</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;mammal.add&nbsp;(horse);<br />
&nbsp;&nbsp;animal.add&nbsp;(mammal);<br />
&nbsp;&nbsp;biology.add&nbsp;(animal);<br />
&nbsp;&nbsp;JTree&nbsp;example6&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(biology);<br />
&nbsp;&nbsp;horse.isLeaf();<br />
&nbsp;&nbsp;horse.isRoot();<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
<br />
<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">构造函数:JTree(TreeModel&nbsp;newModel)<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">用DefaultMutableTreeNodel类定义一个结点再用这个结点做参数定义一个用DefaultTreeMode<br />
&nbsp;&nbsp;</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">创建一个树的模型,再用JTree的构造函数创建一个树</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;root&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Root1</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;child1&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Child1</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;child11&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Child11</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;DefaultMutableTreeNode&nbsp;child111&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultMutableTreeNode&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">Child111</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;root.add&nbsp;(child1);&nbsp;child1.add&nbsp;(child11);&nbsp;child11.add&nbsp;(child111);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;DefaultTreeModel&nbsp;model&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;DefaultTreeModel&nbsp;(root);<br />
&nbsp;&nbsp;<br />
&nbsp;&nbsp;JTree&nbsp;example7&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JTree&nbsp;(model);<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;JPanel&nbsp;panel&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JPanel();<br />
&nbsp;&nbsp;panel.setLayout&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;BoxLayout&nbsp;(panel,&nbsp;BoxLayout.X_AXIS));<br />
&nbsp;&nbsp;panel.setPreferredSize&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;Dimension&nbsp;(</span> <span style="color: rgb(0,0,0)">700</span> <span style="color: rgb(0,0,0)">,&nbsp;</span> <span style="color: rgb(0,0,0)">400</span> <span style="color: rgb(0,0,0)">));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example1));</span> <span style="color: rgb(0,128,0)">//</span> <span style="color: rgb(0,128,0)">JTree必须放在JScrollPane上</span> <span style="color: rgb(0,128,0)"><br />
</span><span style="color: rgb(0,0,0)">&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example2));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example3));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example4));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example5));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example6));<br />
&nbsp;&nbsp;panel.add&nbsp;(</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JScrollPane&nbsp;(example7));<br />
&nbsp;&nbsp;<br />
<br />
&nbsp;<br />
<br />
&nbsp;&nbsp;JFrame&nbsp;frame&nbsp;</span> <span style="color: rgb(0,0,0)">=</span> <span style="color: rgb(0,0,0)">&nbsp;</span> <span style="color: rgb(0,0,255)">new</span> <span style="color: rgb(0,0,0)">&nbsp;JFrame&nbsp;(</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">JTreeDemo</span> <span style="color: rgb(0,0,0)">"</span> <span style="color: rgb(0,0,0)">);<br />
&nbsp;&nbsp;frame.setDefaultCloseOperation&nbsp;(JFrame.EXIT_ON_CLOSE);<br />
&nbsp;&nbsp;frame.setContentPane&nbsp;(panel);<br />
&nbsp;&nbsp;frame.pack();<br />
&nbsp;&nbsp;frame.show();<br />
&nbsp;}<br />
}</span> &#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;&#215;<br />
<span class="oblog_text">
<p>在实际开发过程中会经常使用JTree组件，平时会遇到这样或那样的问题，在此将偶得一点经验写下来，与大家共享，希望对大家有所帮助。</p>
<p>private JTree jtNetDevice;//数组件申明<br />
private JScrollPane jspTree;//滚动面板申明</p>
<p><br />
<strong>1、初始化</strong><br />
&nbsp;&nbsp;&nbsp; DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");<br />
&nbsp;&nbsp;&nbsp; jtNetDevice = new JTree(rootNode);<br />
&nbsp;&nbsp;&nbsp; jtNetDevice.setAutoscrolls(true);<br />
&nbsp;&nbsp;&nbsp; getTreeSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//设置单选模式<br />
&nbsp;&nbsp;&nbsp; jspTree = new JScrollPane();<br />
&nbsp;&nbsp;&nbsp; jspTree.getViewport().add(jtNetDevice, null);</p>
<p><strong>2、三个经常使用的取值函数</strong><br />
&nbsp; private DefaultTreeModel getTreeModel(){<br />
&nbsp;&nbsp;&nbsp; return (DefaultTreeModel)jtNetDevice.getModel();<br />
&nbsp; }</p>
<p>&nbsp; private DefaultMutableTreeNode getRootNode(){<br />
&nbsp;&nbsp;&nbsp; return (DefaultMutableTreeNode)getTreeModel().getRoot();<br />
&nbsp; }<br />
&nbsp; <br />
&nbsp; private TreeSelectionModel getTreeSelectionModel(){<br />
&nbsp;&nbsp;&nbsp; return jtNetDevice.getSelectionModel();<br />
&nbsp; }<br />
&nbsp; </p>
<p><strong>3、根据node得到path：<br />
</strong>&nbsp; TreePath visiblePath = new TreePath(getTreeModel().getPathToRoot(node));</p>
<p><strong>4、根据Path展开到该节点<br />
</strong>&nbsp; jtNetDevice.makeVisible(visiblePath);</p>
<p><strong>5、根据path设定该节点选定<br />
</strong>&nbsp; jtNetDevice.setSelectionPath(visiblePath); </p>
<p><strong>6、选中节点的方法<br />
</strong>&nbsp; 首先，根据节点得到树路径，其中chosen为需要选中的节点<br />
&nbsp; TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevice.getModel()).<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getPathToRoot(chosen));<br />
&nbsp; 然后根据Path选中该节点<br />
&nbsp; jtNetDevice.setSelectionPath(visiblePath);</p>
<p><strong>7、滚动到可见位置</strong><br />
&nbsp; jtNetDevice.scrollPathToVisible(visiblePath);</p>
<p><strong>8、给JTree添加右键弹出菜单<br />
</strong>&nbsp; void jtNetDevice_mouseReleased(MouseEvent e) {<br />
&nbsp;&nbsp;&nbsp; if (e.isPopupTrigger()) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());//弹出右键菜单<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }</p>
<p><strong>9、关于JTree的展开<br />
</strong>&nbsp;&nbsp; // If expand is true, expands all nodes in the tree.<br />
&nbsp;&nbsp; // Otherwise, collapses all nodes in the tree.<br />
&nbsp;&nbsp; public void expandAll(JTree tree, boolean expand) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode root = (TreeNode)tree.getModel().getRoot();<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Traverse tree from root<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expandAll(tree, new TreePath(root), expand);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; private void expandAll(JTree tree, TreePath parent, boolean expand) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Traverse children<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode node = (TreeNode)parent.getLastPathComponent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node.getChildCount() &gt;= 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Enumeration e=node.children(); e.hasMoreElements(); ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode n = (TreeNode)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreePath path = parent.pathByAddingChild(n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; expandAll(tree, path, expand);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Expansion or collapse must be done bottom-up<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (expand) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.expandPath(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tree.collapsePath(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;</p>
<p><strong>10、如何遍历JTree</strong><br />
&nbsp;&nbsp; //&nbsp;创建树<br />
&nbsp;&nbsp; JTree tree = new JTree();<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; // 添加树节点......<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; //&nbsp;遍历所有节点<br />
&nbsp;&nbsp; visitAllNodes(tree);<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; //&nbsp;仅遍历展开的节点<br />
&nbsp;&nbsp; visitAllExpandedNodes(tree);<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; // Traverse all nodes in tree<br />
&nbsp;&nbsp; public void visitAllNodes(JTree tree) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode root = (TreeNode)tree.getModel().getRoot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitAllNodes(root);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void visitAllNodes(TreeNode node) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // node is visited exactly once<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(node);<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node.getChildCount() &gt;= 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Enumeration e=node.children(); e.hasMoreElements(); ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode n = (TreeNode)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitAllNodes(n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; // Traverse all expanded nodes in tree<br />
&nbsp;&nbsp; public void visitAllExpandedNodes(JTree tree) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode root = (TreeNode)tree.getModel().getRoot();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitAllExpandedNodes(tree, new TreePath(root));<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void visitAllExpandedNodes(JTree tree, TreePath parent) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Return if node is not expanded<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!tree.isVisible(parent)) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // node is visible and is visited exactly once<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode node = (TreeNode)parent.getLastPathComponent();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; process(node);<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Visit all children<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (node.getChildCount() &gt;= 0) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (Enumeration e=node.children(); e.hasMoreElements(); ) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreeNode n = (TreeNode)e.nextElement();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TreePath path = parent.pathByAddingChild(n);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; visitAllExpandedNodes(tree, path);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }</p>
</span><br />
<div class="postDesc">posted on 2006-04-04 17:24 <a href="http://www.blogjava.net/wangxinsh55/">SIMONE</a> 阅读(9202) <a href="http://www.blogjava.net/wangxinsh55/archive/2006/04/04/39219.html#Post">评论(1)</a> &nbsp;<a href="http://www.blogjava.net/wangxinsh55/admin/EditPosts.aspx?postid=39219">编辑</a> &nbsp;<a href="http://www.blogjava.net/wangxinsh55/AddToFavorite.aspx?id=39219">收藏</a> 所属分类: <a href="http://www.blogjava.net/wangxinsh55/category/9223.html">JAVA</a> </div>
<img src ="http://www.blogjava.net/santicom/aggbug/346796.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-03-23 08:32 <a href="http://www.blogjava.net/santicom/archive/2011/03/23/346796.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GridBagLayout   2</title><link>http://www.blogjava.net/santicom/archive/2011/03/18/346534.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Fri, 18 Mar 2011 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/03/18/346534.html</guid><description><![CDATA[<p align="center">&nbsp;</p>
<p>今天终于耐着性子弄懂了GridBagLayout是怎么使用的。<br />
构造函数：<br />
&nbsp;&nbsp;&nbsp; GirdBagLayout()建立一个新的GridBagLayout管理器。<br />
&nbsp;&nbsp;&nbsp; GridBagConstraints()建立一个新的GridBagConstraints对象。<br />
&nbsp;&nbsp;&nbsp; GridBagConstraints(int gridx,int gridy,<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; int gridwidth,int gridheight,<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; double weightx,double weighty,<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; int anchor,int fill, Insets insets,<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; int ipadx,int ipady)建立一个新的GridBagConstraints对象，并指定其参数的值。<br />
看着这一堆的参数就快烦死了，下面就了解一下参数的意思：</p>
<p>参数说明：<br />
&nbsp;gridx,gridy&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 设置组件的位置，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridx设置为GridBagConstraints.RELATIVE代表此组件位于之前所加入组件的右边。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridy设置为GridBagConstraints.RELATIVE代表此组件位于以前所加入组件的下面。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 建议定义出gridx,gridy的位置以便以后维护程序。gridx=0,gridy=0时放在0行0列。</p>
<p>&nbsp;gridwidth,gridheight&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 用来设置组件所占的单位长度与高度，默认值皆为1。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 你可以使用GridBagConstraints.REMAINDER常量，代表此组件为此行或此列的最后一个组件，而且会占据所有剩余的空间。</p>
<p>&nbsp;weightx,weighty&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 用来设置窗口变大时，各组件跟着变大的比例。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 当数字越大，表示组件能得到更多的空间，默认值皆为0。</p>
<p>&nbsp;anchor&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 当组件空间大于组件本身时，要将组件置于何处。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 有CENTER(默认值)、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择。</p>
<p>&nbsp;insets&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 设置组件之间彼此的间距。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 它有四个参数，分别是上，左，下，右，默认为(0,0,0,0)。</p>
<p>ipadx,ipady&nbsp;&nbsp;&nbsp; ——&nbsp;&nbsp;&nbsp; 设置组件间距，默认值为0。</p>
<p>GridBagLayout里的各种设置都必须通过GridBagConstraints，因此当我们将GridBagConstraints的参数都设置<br />
好了之后，必须new一个GridBagConstraints的对象出来，以便GridBagLayout使用。</p>
<p>代码片断：<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JButton b;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagConstraints c;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; double weightx,weighty;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Insets inset;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame f=new JFrame();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; GridBagLayout gridbag=new GridBagLayout();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container contentPane=f.getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.setLayout(gridbag);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b=new JButton("first");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridx=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridy=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridwidth=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridheight=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; weightx=10;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; weighty=1;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anchor=GridBagConstraints.CENTER;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fill=GridBagConstraints.HORIZONTAL;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; inset=new Insets(0,0,0,0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipadx=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ipady=0;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,fill,inset,ipadx,ipady);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; gridbag.setConstraints(b,c);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.add(b);</p>
<p><br />
GridBagLayout这种管理器是十分灵活的，只不过他写起来比较麻烦，不过用了之后才发现他对界面的部署帮助很大。<br />
&nbsp;</p>
<p><br />
本文来自CSDN博客，转载请标明出处：http://blog.csdn.net/dracularking/archive/2008/04/22/2314336.aspx</p>
<img src ="http://www.blogjava.net/santicom/aggbug/346534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-03-18 14:27 <a href="http://www.blogjava.net/santicom/archive/2011/03/18/346534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>GridBagLayout</title><link>http://www.blogjava.net/santicom/archive/2011/02/24/345042.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 24 Feb 2011 02:32:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/02/24/345042.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/345042.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/02/24/345042.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/345042.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/345042.html</trackback:ping><description><![CDATA[<p>下面的是这个界面的一个原始草图：</p>
<p>&nbsp;</p>
<div forimg="1">
<p><a href="http://hiphotos.baidu.com/l3130y/pic/item/3856be1e63cfe20340341772.jpg" target="_blank"><img class="blogimg" style="width: 578px; height: 356px" height="190" src="http://image21.360doc.com/DownloadImg/2011/01/0615/8270809_3.jpg" width="578" border="0" small="1"  alt="" /></a></p>
<p>正如你所看到的，最终的结果看上去和计划的想法完全一样。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 你应该能看到在草图里有一些线，这些线是用来把总界面分成若干行和列的，这样你就很清楚每一个组件放置的格子位置。这就是GridBagLayout里"格"的那一部分，而图上的数字就是格的号码。</p>
<p align="left">在某种意义上说, 我们可以把GridBagLayout想象成为早些年的HTML3和4，它们都是基于表的布局，Grid的概念就类似rowspan和colspan的意思，只不过换了个名字罢了。</p>
<p align="left">随着我们的界面和表格的设置完成，是时候该进行界面布局并开始写代码了。</p>
<p><strong>工作过程</strong></p>
<p>这一节我假定你已经了解了基本的窗口和组件创建知识。</p>
<p>通过这篇文章我们最终能在一个frame中布局组件，我们将在以后的文章对界面进行改进使它更适用。因此,为了了解这整个工作的过程，我们列出了所有的目标代码。</p>
<pre>import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
public class GridBagWindow extends JFrame {<br />
private JButton searchBtn;<br />
private JComboBox modeCombo;<br />
private JLabel tagLbl;<br />
private JLabel tagModeLbl;<br />
private JLabel previewLbl;<br />
private JTable resTable;<br />
private JTextField tagTxt;<br />
public GridBagWindow() {<br />
Container contentPane = getContentPane();<br />
GridBagLayout gridbag = new GridBagLayout();<br />
contentPane.setLayout(gridbag);<br />
GridBagConstraints c = new GridBagConstraints();<br />
//setting a default constraint value<br />
c.fill =GridBagConstraints.HORIZONTAL;<br />
tagLbl = new JLabel("Tags");<br />
c.gridx = 0; //x grid position<br />
c.gridy = 0; //y grid position<br />
gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object<br />
contentPane.add(tagLbl); //add it to content pane<br />
tagModeLbl = new JLabel("Tag Mode");<br />
c.gridx = 0;<br />
c.gridy = 1;<br />
gridbag.setConstraints(tagModeLbl, c);<br />
contentPane.add(tagModeLbl);<br />
tagTxt = new JTextField("plinth");<br />
c.gridx = 1;<br />
c.gridy = 0;<br />
c.gridwidth = 2;<br />
gridbag.setConstraints(tagTxt, c);<br />
contentPane.add(tagTxt);<br />
String[] options = {"all", "any"};<br />
modeCombo = new JComboBox(options);<br />
c.gridx = 1;<br />
c.gridy = 1;<br />
c.gridwidth = 1;<br />
gridbag.setConstraints(modeCombo, c);<br />
contentPane.add(modeCombo);<br />
searchBtn = new JButton("Search");<br />
c.gridx = 1;<br />
c.gridy = 2;<br />
gridbag.setConstraints(searchBtn, c);<br />
contentPane.add(searchBtn);<br />
resTable = new JTable(5,3);<br />
c.gridx = 0;<br />
c.gridy = 3;<br />
c.gridwidth = 3;<br />
gridbag.setConstraints(resTable, c);<br />
contentPane.add(resTable);<br />
previewLbl = new JLabel("Preview goes here");<br />
c.gridx = 0;<br />
c.gridy = 4;<br />
gridbag.setConstraints(previewLbl, c);<br />
contentPane.add(previewLbl);<br />
addWindowListener(new WindowAdapter() {<br />
public void windowClosing(WindowEvent e) {<br />
System.exit(0);<br />
}<br />
});<br />
}<br />
public static void main(String args[]) {<br />
GridBagWindow window = new GridBagWindow();<br />
window.setTitle("GridBagWindow");<br />
window.pack();<br />
window.setVisible(true);<br />
}<br />
}</pre>
<p>&nbsp;</p>
<p>构造方法前的代码都不是很特殊，都是一些相当标准的import和变量定义。但是进入构造方法后，事情就变得有趣了。</p>
<p>Container contentPane = getContentPane();</p>
<p>GridBagLayout gridbag = new GridBagLayout();</p>
<p>contentPane.setLayout(gridbag);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 我们以GridBagWindow的内容面板作为开始来创建一个GridBagLayout对象，准确地说，这个方法与过去我们所创建 GridLayout对象和BorderLayout对象的方法是一样的。那么，现在我们就开始来设置GridBagLayout对象使它作为内容面板的 布局。</p>
<p>GridBagConstraints c = new GridBagConstraints();</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 然后我要提到这整个进程中的一个独特的对象，那就是GridBagConstraints。这个对象在GridBagLayout中控制所 有被安置在其中组件的约束。为了把一个组件增加到你的GridBagLayout中去，你首先必须将它与一个GridBagConstraints对象建 立连接。</p>
<p>GridBagConstraints可以从11个方面来进行控制和操纵，也可以给你提供一些帮助。这些内容是：</p>
<ul>
    <li>Gridx——组件的横向坐标
    <li>Girdy——组件的纵向坐标
    <li>Gridwidth——组件的横向宽度，也就是指组件占用的列数，这与HTML的colspan类似
    <li>Gridheight——组件的纵向长度，也就是指组件占用的行数，这与HTML的rowspan类似
    <li>Weightx——指行的权重，告诉布局管理器如何分配额外的水平空间
    <li>Weighty——指列的权重，告诉布局管理器如何分配额外的垂直空间
    <li>Anchor——告诉布局管理器组件在表格空间中的位置
    <li>Fill——如果显示区域比组件的区域大的时候，可以用来控制组件的行为。控制组件是垂直填充，还是水平填充，或者两个方向一起填充
    <li>Insets——指组件与表格空间四周边缘的空白区域的大小
    <li>Ipadx——<strong> </strong>组件间的横向间距,组件的宽度就是这个组件的最小宽度加上ipadx值
    <li>ipady——<strong> </strong>组件间的纵向间距,组件的高度就是这个组件的最小高度加上ipady值 </li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 可能对于一个组件的每一个实例你都需要为它建立一个单独的GridBagConstraints；然而，这种方法我们并不推荐使用。最好的方法是，当你调用它的时候把对象设置为默认值，然后针对于每一个组件改变其相应的域。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 这个方法具有通用性，因为在一些域中，比如insets、padx、pady和fill这些域，对于每一个组件来说一般都是相同的，因此这样对一个域进行设置就会更轻松了，也能更轻松的在另外的组件中改变某些域的值。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 如果在改变了某些域值之后，你想回到原始的域值的话，你应该在增加下一个组件之前进行改变。这种方法使你更容易明白你正在修改的内容，也能使你更容易明白在一连串对象中的这11个参数的作用。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 也许你现在对这些内容还是一知半解，不过事实上一旦你理解了GridBagConstraints，值得安慰的是你以后做再困难的工作都会游刃有余了。</p>
<p>所以，如果我们已经明白了GridBagConstraints的详细用法了，那么现在就让我们来看看在实际应用中应该如何来实现它：</p>
<p>tagLbl = new JLabel("Tags");<br />
c.gridx = 0; //x grid position<br />
c.gridy = 0; //y grid position<br />
gridbag.setConstraints(tagLbl, c); //设置标签的限制</p>
<p>contentPane.add(tagLbl); //增加到内容面板</p>
<p>我们所做的是示例我们的标签、分配给它一个格位置，将它与一个约束对象联系起来并把它增加到我们的内容面板中。</p>
<p>tagModeLbl = new JLabel("Tag Mode");<br />
c.gridx = 0;<br />
c.gridy = 1;<br />
gridbag.setConstraints(tagModeLbl, c);</p>
<p>contentPane.add(tagModeLbl);</p>
<p>&nbsp;&nbsp; 请注意，虽然我们已经在我们的约束对象中把gridx的值设置为0，但是在这里我们仍然要对它进行重新设置——这样做没有其它原因，只是为了增加可读性。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 下面，我们增加一个文本域以便能存储我们希望能搜索到的关键字，再增加一个组合框以便用来搜索多个关键字。除了我们希望的文本域有两列之外，这个概念其他的方面都与上面所说的是相同的，所以，我们需要在增加组合框之前重新设置文本域的值。</p>
<p>tagTxt = new JTextField("plinth");<br />
c.gridx = 1;<br />
c.gridy = 0;<br />
c.gridwidth = 2;<br />
gridbag.setConstraints(tagTxt, c);<br />
contentPane.add(tagTxt);</p>
<p>String[] options = {"all", "any"};<br />
modeCombo = new JComboBox(options);<br />
c.gridx = 1;<br />
c.gridy = 1;<br />
c.gridwidth = 1;<br />
gridbag.setConstraints(modeCombo, c);<br />
contentPane.add(modeCombo);</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 做了这些之后，我们再在内容面板中增加一些其余的简单组件，这时候我们就能够浏览它了；其余的代码应该不会出现任何问题了。</p>
<p>到这个阶段，我们应该已经得到了一个类似于我们先前所设计的界面了。</p>
</div>
<img src ="http://www.blogjava.net/santicom/aggbug/345042.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-02-24 10:32 <a href="http://www.blogjava.net/santicom/archive/2011/02/24/345042.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JComboBox</title><link>http://www.blogjava.net/santicom/archive/2011/02/17/344487.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 17 Feb 2011 00:24:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/02/17/344487.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/344487.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/02/17/344487.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/344487.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/344487.html</trackback:ping><description><![CDATA[7-4:JComboBox的使用：<br />
类层次结构图：<br />
&nbsp;&nbsp; java.lang.Object<br />
&nbsp;&nbsp;&nbsp; --java.awt.Component<br />
&nbsp;&nbsp;&nbsp;&nbsp; --java.awt.Container<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --javax.swing.JComponent<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; --javax.swing.JComboBox <br />
&nbsp;&nbsp; 构造函数：<br />
&nbsp;&nbsp;&nbsp; JComboBox():建立一个新的JComboBox组件。<br />
&nbsp;&nbsp;&nbsp; JComboBox(ComboBoxModel aModel):用ListModel建立一个新的JComboBox组件。<br />
&nbsp;&nbsp;&nbsp; JComboBox(Object[] items):利用Array对象建立一个新的JComboBox组件。<br />
&nbsp;&nbsp;&nbsp; JComboBox(Vector items):利用Vector对象建立一个新的JComboBox组件。 <br />
7-4-1:建立一般的JComboBox:<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
import java.util.Vector;<br />
<br />
public class JComboBox1{<br />
public static void main(String[] args){<br />
JFrame f=new JFrame("JComboBox1");<br />
Container contentPane=f.getContentPane();<br />
contentPane.setLayout(new GridLayout(1,2));<br />
String[] s = {"美国","日本","大陆","英国","法国","意大利","澳洲","韩国"};<br />
Vector v=new Vector();<br />
v.addElement("Nokia 8850");<br />
v.addElement("Nokia 8250");<br />
v.addElement("Motorola v8088");<br />
v.addElement("Motorola v3850");<br />
v.addElement("Panasonic 8850");<br />
&nbsp;&nbsp;&nbsp; v.addElement("其它");<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; JComboBox combo1=new JComboBox(s);<br />
&nbsp;&nbsp;&nbsp; combo1.addItem("中国");//利用JComboBox类所提供的addItem()方法，加入一个项目到此JComboBox中。<br />
&nbsp;&nbsp;&nbsp; combo1.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家玩呢?"));<br />
&nbsp;&nbsp;&nbsp; JComboBox combo2=new JComboBox(v);<br />
&nbsp;&nbsp;&nbsp; combo2.setBorder(BorderFactory.createTitledBorder("你最喜欢哪一种手机呢？"));&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; contentPane.add(combo1);<br />
&nbsp;&nbsp;&nbsp; contentPane.add(combo2);<br />
&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter(){<br />
&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e){<br />
&nbsp;&nbsp;&nbsp; System.exit(0); <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });<br />
}<br />
}<br />
7-4-2:利用ComboModel构造JComboBox:<br />
&nbsp;&nbsp;&nbsp; 如同JList一般，在JComboBox中也有一个构造函数是利用某种Model来构造。如下所示:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox(COmboBoxModel aModel)<br />
&nbsp;&nbsp; ComboBoxModel是一个interface,里面定义了两个方法，分别是setSelectedItem()与getSelectedItem().这两个方法目的是让用<br />
户选取某个项目后，可正确地显示出用户所选取的项目。下面是这两个方法的详细定义:<br />
ComboBoxModel interface定义的方法：<br />
&nbsp;&nbsp; Object&nbsp;&nbsp;&nbsp; getSelectedItem():返回所选取的项目值。<br />
&nbsp;&nbsp; Void&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setSelectedItem(Object anItem):设置所选取的项目值.<br />
<br />
与JList不同的是，JComboBox是利用ComboBoxModel,而不是ListModel.不过ComboBoxModel interface是继承ListModel interface<br />
,因此若我们要利用ComboBoxModel来构造JComboBox,除了要实作ComboBoxModel的两个方法外，还必须实作ListModel的所定义的4个<br />
方法，这样的做法可说相当麻烦。<br />
&nbsp;&nbsp; 在介绍JList时我们曾经提到AbstractListModel这个抽象类。这个抽象类实作了ListModel interface中的addListDataListener<br />
()、removeListDataListener()这两个方法。因此若我们继承AbstractListModel,则可少掉实作这两个方法，只需要实作<br />
getElementAt()、getSize()、setSelectedItem()与getSelectedItem()这4个方法。这样的作法就显得比较简单一点.<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox2{<br />
String[] s= {"美国","日本","大陆","英国","法国","意大利","澳洲","韩国"};<br />
public JComboBox2(){<br />
&nbsp;&nbsp;&nbsp; JFrame f=new JFrame("JComboBox2"); <br />
&nbsp;&nbsp;&nbsp; Container contentPane=f.getContentPane();<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; ComboBoxModel mode=new UserDefineComboBoxModel();<br />
&nbsp;&nbsp;&nbsp; JComboBox combo=new JComboBox(mode);<br />
&nbsp;&nbsp;&nbsp; combo.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家去玩?"));<br />
&nbsp;&nbsp;&nbsp; contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter(){<br />
&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e){<br />
&nbsp;&nbsp;&nbsp; System.exit(0); <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; });&nbsp;&nbsp; <br />
} <br />
public static void main(String[] args){<br />
new JComboBox2();<br />
}<br />
<br />
class UserDefineComboBoxModel extends AbstractListModel implements ComboBoxModel{<br />
String item=null;<br />
public Object getElementAt(int index){<br />
&nbsp;&nbsp; return s[index++]; <br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp; //由于继承AbstractListModel抽象类。因此我们分别在程序中实作了getElementAt()与getSize()方法。<br />
public int getSize(){<br />
&nbsp;&nbsp;&nbsp; return s.length; <br />
}<br />
&nbsp;&nbsp;&nbsp;&nbsp; //由于我们实现了ComboBoxModel interface.因此我们必须在程序中实作setSelectedItem()与getSelectedItem()方法.<br />
public void setSelectedItem(Object anItem){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; item=(String)anItem; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp; public Object getSelectedItem(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return item; <br />
&nbsp;&nbsp;&nbsp;&nbsp; }<br />
}<br />
}<br />
&nbsp;&nbsp; 当程序要show出JComboBox时，系统会先自动调用getSize()方法，看看这个JComboBox长度有多少，然后再调用getElementAt()<br />
方法，将String Array s中的值填入JComboBox中。当用户选择项目时，系统会调用getSelectedItem()方法，返回所选取的项目，并<br />
利用setSelectedItem()方法，将选取项目放在JComboBox最前端。<br />
&nbsp;&nbsp; getElementAt()方法中的&#8220;index&#8221;参数，系统会自动由0计算，不过要自己作累加的操作，如程序中:<br />
&nbsp;&nbsp;&nbsp; return s[index++];<br />
如同JList一般，java对于JComboBox也提供了另一个类，DefaultComboBoxModel实体类。此类继承了AbstractListModel抽象类，也<br />
实作了ComboBoxModel interface.因此你不需要再实作getSize()、getElementAt()、setSelectedItem()与getSelectedItem()方法。<br />
利用DefaultComboBoxModel这个类我们可以很方便地做到动态更改JComboBox的项目值。当你没有必要自己定义特殊的ComboBoxModel<br />
时，使用DefaultComboBoxModel就显得非常的方便，我们来看下面的例子:<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox3{<br />
&nbsp;&nbsp; String[] s = {"美国","日本","大陆","英国","法国","意大利","澳洲","韩国"};<br />
&nbsp;&nbsp; public JComboBox3(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame f=new JFrame("JComboBox3"); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container contentPane=f.getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboBoxModel mode=new AModel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox combo=new JComboBox(mode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setBorder(BorderFactory.createTitledBorder("您最喜欢到哪个国家玩呢？"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter(){<br />
&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e){<br />
&nbsp;&nbsp;&nbsp; System.exit(0); <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public static void main(String[] args){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new JComboBox3(); <br />
&nbsp;&nbsp; } <br />
&nbsp;&nbsp; class AModel extends DefaultComboBoxModel{<br />
&nbsp;&nbsp; AModel(){<br />
&nbsp;&nbsp; for (int i=0;i&lt;s.length;i++)<br />
&nbsp;&nbsp; addElement(s[i]);<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}<br />
&nbsp;&nbsp;&nbsp; 1.由于AModel继承DefaultComboBoxModel实体类，由AModel可得到一个ComboBoxModel实体对象。<br />
&nbsp;&nbsp;&nbsp; 2.我们使AModel继承DefaultComboBoxModel实体类，因此就不需要再实作getElementAt()、getSize()、setSelectedItem()与<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getSelectedItem()这4个方法，直接将所要的项目用addElement()方法加入即可。系统会自动将所加入的项目放进一个Vector<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 中，并在输出JComboBox时自动调用getSize()与getElementAt()方法。<br />
7-4-3:建立有图像的JComboBox:<br />
&nbsp;&nbsp;&nbsp; 在上一节中我们利用ListCellRenderer interface在JList中加入Icon图像，而要在JComboBox中加入图像的方法也是一样的。<br />
我们必须实作ListCellRenderer interface所定义的方法getListCellRendererComponent.以下为这个方法的定义：<br />
要先了解ListCellRenderer interface.我们必须由这个interface所定义的方法，将图像画在JComboBox中的每个项目。<br />
ListCellRenderer interface里只定义了一个方法，那就是getListCellRendererComponent,不过这个参数有点多，我们把它列出来<br />
看看:<br />
public Component getListCellRendererComponent(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;&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;&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;&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;&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 />
list:即所要画上的图像的JComboBox组件。<br />
value:JComboBox项目值，如JComboBox.getModel().getElementAt(index)所返回的值。<br />
index:为JComboBox项目的索引值，由0开始。<br />
isSelected与cellHasFocus:判断JComboBox中的项目是否有被选取或是有焦点置入。<br />
上面这4个参数会在你设置JComboBox的绘图样式(setCellRenderer())时自动的由JComboBox组件提供，你只要关心怎么控制<br />
getListCellRendererComponent()方法中的4个参数，而无需担心怎么参数传入。<br />
&nbsp;&nbsp; 要在JList中加入Icon图像的技巧就是将JComboBox中的每一个项目当作是JLabel,因为JLabel在使用文字与图像上非常的方便，要设置JComboBox的图像，<br />
必须使用setRenderer(ListCellRenderer cellRenderer){注:我们在JList中画上图像是利用JList所提供的setCellRenderer(ListCellRenderer <br />
cellRenderer)方法,读者请小心}这个方法。我们来看下面这个范例，你就能明白了!<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox4{<br />
String[] s={"西瓜","苹果","草莓","香蕉","葡萄"}; <br />
public JComboBox4(){<br />
JFrame f=new JFrame("JComboBox");<br />
Container contentPane=f.getContentPane();<br />
<br />
JComboBox combo=new JComboBox(s);<br />
combo.setBorder(BorderFactory.createTitledBorder("你最喜欢吃哪些水果?"));<br />
combo.setRenderer(new ACellRenderer());<br />
combo.setMaximumRowCount(3);<br />
<br />
contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter(){<br />
&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e){<br />
&nbsp;&nbsp;&nbsp; System.exit(0); <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
public static void main(String[] args){<br />
new JComboBox4();<br />
}<br />
}<br />
class ACellRenderer extends JLabel implements ListCellRenderer{<br />
ACellRenderer(){<br />
&nbsp;&nbsp; setOpaque(true); <br />
}<br />
public Component getListCellRendererComponent(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;&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;&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;&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;&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; if (value!=null){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setText(value.toString());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setIcon(new ImageIcon(".\\icons\\fruit"+(index+1)+".jpg"));<br />
&nbsp;&nbsp;&nbsp; } <br />
&nbsp;&nbsp;&nbsp; if (isSelected){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setBackground(list.getSelectionBackground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getSelectionForeground()); <br />
&nbsp;&nbsp;&nbsp; }else{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setBackground(list.getBackground()); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getForeground());<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;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; return this;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
}<br />
&nbsp;&nbsp;&nbsp; 各们读者在运行这个程序时会发现，即使JComboBox的选项中有图标，但在选后图标却不会显示在显示列中，原因是在上面程序中<br />
我们以String Array s建立JComboBox:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox combo=new JComboBox(s);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String Array s里面放的只是水果名称，而并没有图标。当我们使用setRenderer()方法来JComboBox时，只会绘制JComboBox的<br />
选项部份，而最后显示在JComboBox上的值还是以String Array s为依据。因此JComboBox显示列就只会显示文字而已，而不会显示出<br />
图形。要解决这个问题，我们必须改变JComboBox所传入的参数内容，也就是将原来的String Array s更改成具有图形的数据项。在<br />
此我们是利用JComboBox(Object[] items)来建立有图像的JComboBox,我们所传进去的Object Array不应该只有文字，而必须连图标一<br />
并传入。我们修改上个范例修改如下:<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox5<br />
{<br />
&nbsp;&nbsp;&nbsp; String[] s = {"西瓜","苹果","草莓","香蕉","葡萄"};<br />
&nbsp;&nbsp;&nbsp; ImageIcon[] icons = new ImageIcon[5];;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public JComboBox5()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame f = new JFrame("JComboBox");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container contentPane = f.getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ItemObj[] obj = new ItemObj[5];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i &lt; 5; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; obj[i] = new ItemObj(s[i],icons[i]);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox combo = new JComboBox(obj);//利用ItemObj Array obj当作是JComboBox的参数传入，构造出JComboBox.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果？"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setRenderer(new ACellRenderer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setMaximumRowCount(3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);<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 />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new JComboBox5();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
class ItemObj<br />
{<br />
&nbsp;&nbsp;&nbsp; String name;<br />
&nbsp;&nbsp;&nbsp; ImageIcon icon;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public ItemObj(String name, ImageIcon icon){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.icon = icon;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;&nbsp;&nbsp; <br />
class ACellRenderer extends JLabel implements ListCellRenderer<br />
{<br />
&nbsp;&nbsp;&nbsp; ACellRenderer()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setOpaque(true);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Component getListCellRendererComponent(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;&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; 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;&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; 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;&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; 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;&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; boolean cellHasFocus)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setText(((ItemObj)value).name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setIcon(((ItemObj)value).icon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isSelected) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setBackground(list.getSelectionBackground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getSelectionForeground());<br />
&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; setBackground(list.getBackground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getForeground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
&nbsp;&nbsp; 你可以发现，第一栏显示有图标显示出来了。当然你也可以利用ComboBoxModel方式来构造出有图标的JComboBox.我们来看下面<br />
的例子:<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox6{<br />
String[] s={"西瓜","苹果","草莓","香蕉","葡萄"};<br />
ImageIcon[] icons=new ImageIcon[5];<br />
public JComboBox6(){<br />
&nbsp;&nbsp;&nbsp; JFrame f=new JFrame("JComboBox"); <br />
&nbsp;&nbsp;&nbsp; Container contentPane=f.getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for(int i=0; i &lt; 5; i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboBoxModel mode=new AModel();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox combo=new JComboBox(mode);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setBorder(BorderFactory.createTitledBorder("您喜欢吃哪些水果？"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setRenderer(new ACellRenderer());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setMaximumRowCount(3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br />
} <br />
public static void main(String[] args){<br />
new JComboBox6();<br />
}<br />
/*我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的<br />
ComboBoxModel.<br />
*/<br />
class AModel extends DefaultComboBoxModel{<br />
AModel(){<br />
&nbsp;&nbsp; for (int i=0;i&lt;s.length;i++){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ItemObj obj=new ItemObj(s[i],icons[i]); <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addElement(obj);<br />
&nbsp;&nbsp; } <br />
}<br />
}<br />
}<br />
class ItemObj<br />
{<br />
&nbsp;&nbsp;&nbsp; String name;<br />
&nbsp;&nbsp;&nbsp; ImageIcon icon;<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public ItemObj(String name, ImageIcon icon){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.name = name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.icon = icon;<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp;&nbsp;&nbsp; <br />
class ACellRenderer extends JLabel implements ListCellRenderer<br />
{<br />
&nbsp;&nbsp;&nbsp; ACellRenderer()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setOpaque(true);<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public Component getListCellRendererComponent(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;&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; 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;&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; 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;&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; 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;&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; boolean cellHasFocus)<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (value != null)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setText(((ItemObj)value).name);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setIcon(((ItemObj)value).icon);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (isSelected) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setBackground(list.getSelectionBackground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getSelectionForeground());<br />
&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; setBackground(list.getBackground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; setForeground(list.getForeground());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return this;<br />
&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp; <br />
}<br />
<br />
&nbsp;&nbsp; 我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中编写一个继承DefaultComboBoxModel的<br />
ComboBoxModel.<br />
<br />
7-4-4:建立可自行输入的JComboBox:<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox7<br />
{<br />
&nbsp;&nbsp;&nbsp; String[] fontsize = {"12","14","16","18","20","22","24","26","28"};<br />
&nbsp;&nbsp;&nbsp; String defaultMessage = "请选择或直接输入文字大小！";<br />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public JComboBox7()<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JFrame f = new JFrame("JComboBox");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Container contentPane = f.getContentPane();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JComboBox combo = new JComboBox(fontsize);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大小"));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.setEditable(true);//将JComboBox设成是可编辑的.<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ComboBoxEditor editor = combo.getEditor();//getEditor()方法返回ComboBoxEditor对象,如果你查看手册，你就会发<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //现ComboBoxEditor是个接口(interface),因此你可以自行实作这个接口，制作自己想要的ComboBoxEditor组件。但通常<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //我们不需要这么做，因为默认的ComboBoxEditor是使用JTextField,这已经足够应付大部份的情况了。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //configureEditor()方法会初始化JComboBox的显示项目。例如例子中一开始就出现:"请选择或直接输入文字大小！"这个<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //字符串。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; combo.configureEditor(editor, defaultMessage);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter() {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.exit(0);<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 />
&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; public static void main(String args[])<br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; new JComboBox7();<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
7-4-5:JComboBox的事件处理:<br />
&nbsp;&nbsp;&nbsp; JComboBox的事件处理亦可分为两种，一种是取得用户选取的项目;另一种是用户在JComboBox上自行输入完毕后按下[Enter]键,<br />
运作相对应的工作。对于第一种事件的处理，我们使用ItemListener.对于第二种事件的处理，我们使用ActionListener.<br />
&nbsp;&nbsp;&nbsp; 这个范例用户可以选取所要的字号，字号的变化会呈现在JLabel上，并可让用户自行输入字体的大小。当用户按下[Enter]键后<br />
，若用户输入的值不在选项上时，此输入值会增加至JComboBox中，并将输入字体的大小显示在JLabel上。<br />
<br />
import java.awt.*;<br />
import java.awt.event.*;<br />
import javax.swing.*;<br />
<br />
public class JComboBox8 implements ItemListener,ActionListener{<br />
String[] fontsize={"12","14","16","18","20","22","24","26","28"};<br />
String defaultMessage="请选择或直接输入文字大小!";<br />
Font font=null;<br />
JComboBox combo=null;<br />
JLabel label=null;<br />
<br />
public JComboBox8(){<br />
JFrame f=new JFrame("JComboBox"); <br />
Container contentPane=f.getContentPane();<br />
contentPane.setLayout(new GridLayout(2,1));<br />
label=new JLabel("Swing",JLabel.CENTER);<br />
font=new Font("SansSerif",Font.PLAIN,12);<br />
label.setFont(font);<br />
<br />
combo=new JComboBox(fontsize);<br />
combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大小:"));<br />
combo.setEditable(true);<br />
ComboBoxEditor editor=combo.getEditor();<br />
combo.configureEditor(editor,defaultMessage);<br />
combo.addItemListener(this);0<br />
combo.addActionListener(this);<br />
<br />
contentPane.add(label);<br />
contentPane.add(combo);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.pack();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.show();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; f.addWindowListener(new WindowAdapter(){<br />
&nbsp;&nbsp;&nbsp; public void windowClosing(WindowEvent e){<br />
&nbsp;&nbsp;&nbsp; System.exit(0); <br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });&nbsp;&nbsp; <br />
}<br />
&nbsp;&nbsp; public static void main(String[] args){<br />
&nbsp;&nbsp; new JComboBox8();<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void actionPerformed(ActionEvent e){<br />
&nbsp;&nbsp; boolean isaddItem=true;<br />
&nbsp;&nbsp; int fontsize=0;<br />
&nbsp;&nbsp; String tmp=(String)combo.getSelectedItem();<br />
&nbsp;&nbsp; //判断用户所输入的项目是否有重复，若有重复则不增加到JComboBox中。<br />
&nbsp;&nbsp; try{<br />
&nbsp;&nbsp; fontsize=Integer.parseInt(tmp);<br />
&nbsp;&nbsp; for(int i=0;i&lt;combo.getItemCount();i++){<br />
&nbsp;&nbsp; if (combo.getItemAt(i).equals(tmp)){<br />
&nbsp;&nbsp; isaddItem=false;<br />
&nbsp;&nbsp; break;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; if (isaddItem){<br />
&nbsp;&nbsp; combo.insertItemAt(tmp,0);//插入项目tmp到0索引位置(第一列中).<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; font=new Font("SansSerif",Font.PLAIN,fontsize);<br />
&nbsp;&nbsp; label.setFont(font);&nbsp;&nbsp; <br />
&nbsp;&nbsp; }catch(NumberFormatException ne){<br />
&nbsp;&nbsp; combo.getEditor().setItem("你输入的值不是整数值，请重新输入!");<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; public void itemStateChanged(ItemEvent e){//ItemListener界面只有itemStateChanged()一个方法，在此实作它。<br />
&nbsp;&nbsp; if (e.getStateChange()==ItemEvent.SELECTED){//当用户的选择改变时，则在JLabel上会显示出Swing目前字形大小信息.<br />
&nbsp;&nbsp; int fontsize=0;<br />
&nbsp;&nbsp; try{<br />
&nbsp;&nbsp; fontsize=Integer.parseInt((String)e.getItem());<br />
&nbsp;&nbsp; label.setText("Swing 目前字形大小:"+fontsize);&nbsp;&nbsp; <br />
&nbsp;&nbsp; }catch(NumberFormatException ne){//若所输入的值不是整数，则不作任何的操作.<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
}
<img src ="http://www.blogjava.net/santicom/aggbug/344487.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2011-02-17 08:24 <a href="http://www.blogjava.net/santicom/archive/2011/02/17/344487.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>设置JTable不可编辑</title><link>http://www.blogjava.net/santicom/archive/2010/10/08/333952.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Fri, 08 Oct 2010 01:34:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2010/10/08/333952.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/333952.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2010/10/08/333952.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/333952.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/333952.html</trackback:ping><description><![CDATA[将JTable的单元格设置为不可编辑，有两种方法。<br />
一种是自己写一个MyTable类继承DefaultTableModel,重写其中的isCellEditable方法；<br />
还有一种是在创建JTable对象时， JTable treeTable = new JTable(tableModel){ public boolean isCellEditable(int row, int column) { return false; }}; <br />
 <img src ="http://www.blogjava.net/santicom/aggbug/333952.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2010-10-08 09:34 <a href="http://www.blogjava.net/santicom/archive/2010/10/08/333952.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JTable</title><link>http://www.blogjava.net/santicom/archive/2010/10/08/333946.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Fri, 08 Oct 2010 00:37:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2010/10/08/333946.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/333946.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2010/10/08/333946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/333946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/333946.html</trackback:ping><description><![CDATA[<pre>一.创建表格控件的各种方式:
1) 调用无参构造函数.
JTable table = new JTable();
2) 以表头和表数据创建表格.
Object[][] cellData = {{"row1-col1", "row1-col2"},{"row2-col1", "row2-col2"}};
String[] columnNames = {"col1", "col2"};
&nbsp;&nbsp;&nbsp;
JTable table = new JTable(cellData, columnNames);
3) 以表头和表数据创建表格,并且让表单元格不可改.
String[] headers = { "表头一", "表头二", "表头三" };
Object[][] cellData = null; </pre>
<pre>DefaultTableModel model = new DefaultTableModel(cellData, headers) {</pre>
<pre>public boolean isCellEditable(int row, int column) {
&nbsp;&nbsp;&nbsp; return false;
}
};</pre>
<pre>table = new JTable(model);
</pre>
<pre>二.对表格列的控制</pre>
<pre>0)获取JTable中特定单元格的位置</pre>
<pre>table.addMouseListener(new MouseListener() {</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void mouseClicked(MouseEvent e) {</pre>
<pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int row = jt.rowAtPoint(e.getPoint());
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int col = jt.columnAtPoint(e.getPoint());</pre>
<pre>}</pre>
<pre>});</pre>
<pre>&nbsp;&nbsp;&nbsp;
1) 设置列不可随容器组件大小变化自动调整宽度.
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2) 限制某列的宽度.
TableColumn firsetColumn = table.getColumnModel().getColumn(0);
firsetColumn.setPreferredWidth(30);
firsetColumn.setMaxWidth(30);
firsetColumn.setMinWidth(30);
3) 设置当前列数.
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int count=5;
tableModel.setColumnCount(count);
4) 取得表格列数
int cols = table.getColumnCount();
5) 添加列
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addColumn("新列名");
6) 删除列
table.removeColumn(table.getColumnModel().getColumn(columnIndex));// columnIndex是要删除的列序号
三.对表格行的控制
1) 设置行高
table.setRowHeight(20);
2) 设置当前航数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int n=5;
tableModel.setRowCount(n);
3) 取得表格行数
int rows = table.getRowCount();</pre>
<pre>4) 添加表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addRow(new Object[]{"sitinspring", "35", "Boss"});
5) 删除表格行
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
model.removeRow(rowIndex);// rowIndex是要删除的行序号
四.存取表格单元格的数据
1) 取单元格数据
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
String cellValue=(String) tableModel.getValueAt(row, column);// 取单元格数据,row是行号,column是列号
2) 填充数据到表格.
注:数据是Member类型的链表,Member类如下:
public class Member{
&nbsp;&nbsp;&nbsp; // 名称
&nbsp;&nbsp;&nbsp; private String name;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; // 年龄
&nbsp;&nbsp;&nbsp; private String age;
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; // 职务
&nbsp;&nbsp;&nbsp; private String title;
}
填充数据的代码:
public void fillTable(List&lt;Member&gt; members){
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.setRowCount(0);// 清除原有行
// 填充数据
for(Member member:members){
&nbsp;&nbsp;&nbsp; String[] arr=new String[3];
&nbsp;&nbsp;&nbsp; arr[0]=member.getName();
&nbsp;&nbsp;&nbsp; arr[1]=member.getAge();
&nbsp;&nbsp;&nbsp; arr[2]=member.getTitle();
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; // 添加数据到表格
&nbsp;&nbsp;&nbsp; tableModel.addRow(arr);
}
// 更新表格
table.invalidate();
}
2) 取得表格中的数据
public List&lt;Member&gt; getShowMembers(){
List&lt;Member&gt; members=new ArrayList&lt;Member&gt;();
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int rowCount=tableModel.getRowCount();
for(int i=0;i&lt;rowCount;i++){
&nbsp;&nbsp;&nbsp; Member member=new Member();
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; member.setName((String)tableModel.getValueAt(i, 0));// 取得第i行第一列的数据</pre>
<pre>&nbsp;&nbsp;&nbsp; member.setAge((String)tableModel.getValueAt(i, 1));// 取得第i行第二列的数据
&nbsp;&nbsp;&nbsp; member.setTitle((String)tableModel.getValueAt(i, 2));// 取得第i行第三列的数据
&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp; members.add(member);
}
return members;
}
五.取得用户所选的行
1) 取得用户所选的单行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();</pre>
<pre>if(selectRows==1){
int selectedRowIndex = table.getSelectedRow(); // 取得用户所选单行
.// 进行相关处理
}
2) 取得用户所选的多行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();</pre>
<pre>if(selectRows&gt;1)
int[] selRowIndexs=table.getSelectedRows();// 用户所选行的序列
for(int i=0;i&lt;selRowIndexs.length;i++){
&nbsp;&nbsp;&nbsp; // 用tableModel.getValueAt(row, column)取单元格数据
&nbsp;&nbsp;&nbsp; String cellValue=(String) tableModel.getValueAt(i, 1);
}
}
六.添加表格的事件处理</pre>
<pre>view.getTable().addMouseListener(new MouseListener() {
public void mousePressed(MouseEvent e) {
&nbsp;&nbsp;&nbsp; // 鼠标按下时的处理
}</pre>
<pre>public void mouseReleased(MouseEvent e) {
&nbsp;&nbsp;&nbsp; // 鼠标松开时的处理
}</pre>
<pre>public void mouseEntered(MouseEvent e) {
&nbsp;&nbsp;&nbsp; // 鼠标进入表格时的处理
}</pre>
<pre>public void mouseExited(MouseEvent e) {
&nbsp;&nbsp;&nbsp; // 鼠标退出表格时的处理
}</pre>
<pre>public void mouseClicked(MouseEvent e) {
&nbsp;&nbsp;&nbsp; // 鼠标点击时的处理
}
});</pre>
 <img src ="http://www.blogjava.net/santicom/aggbug/333946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/santicom/" target="_blank">Jamie</a> 2010-10-08 08:37 <a href="http://www.blogjava.net/santicom/archive/2010/10/08/333946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>