﻿<?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</title><link>http://www.blogjava.net/santicom/</link><description>不要以为......很遥远</description><language>zh-cn</language><lastBuildDate>Fri, 15 May 2026 23:06:49 GMT</lastBuildDate><pubDate>Fri, 15 May 2026 23:06:49 GMT</pubDate><ttl>60</ttl><item><title>Activity生命周期</title><link>http://www.blogjava.net/santicom/archive/2011/09/02/357842.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Fri, 02 Sep 2011 09:48:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/02/357842.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357842.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/02/357842.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357842.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357842.html</trackback:ping><description><![CDATA[<div><span style="font-family: Comic Sans MS; font-size: 12pt">现有两个Activity:&nbsp; Activity1,Activity2</span><br /><br /><span style="font-family: Comic Sans MS; font-size: 12pt">先启动Activity1运行顺序为： Activity1 onCreate -&gt; Activity1&nbsp;onStart -&gt; Activity1 onResume</span><br /><span style="font-family: Comic Sans MS; font-size: 12pt">用Intent从Activity1跳到Activity2运行顺序 ：&nbsp;</span><br /><span style="font-family: Comic Sans MS; font-size: 12pt">Activity1 onPause -&gt; Activity2 onCreate -&gt; Activity2&nbsp;onStart -&gt; Activity2 onResume -&gt;Activity1 onStop -&gt; Activity1&nbsp; onDestroy</span><br /><span style="font-family: Comic Sans MS; font-size: 12pt">退出应用程序： Activity2 onResume -&gt;Activity2 onStop -&gt; Activity2&nbsp; onDestroy</span><br /><br /></div><img src ="http://www.blogjava.net/santicom/aggbug/357842.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-09-02 17:48 <a href="http://www.blogjava.net/santicom/archive/2011/09/02/357842.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>控制3个线程运行顺序的Demo</title><link>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 18:27:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357783.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/02/357783.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357783.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357783.html</trackback:ping><description><![CDATA[<p><span style="font-family: Comic Sans MS">本程序可以控制3个线程按顺序执行， 代码如下：</span><br /><br /><span style="font-family: Comic Sans MS">public class Test3 {</span></p>
<p><span style="font-family: Comic Sans MS">&nbsp;public static void main(String[] args) throws IOException {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;final Test obj = new Test();</span><br />&nbsp;&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m1();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m2();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;new Thread()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;public void run()</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;obj.m3();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}.start();</span><br />&nbsp;&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;}</span></p>
<p><span style="font-family: Comic Sans MS">}</span></p>
<p><span style="font-family: Comic Sans MS">class Test</span><br /><span style="font-family: Comic Sans MS">{</span><br /><span style="font-family: Comic Sans MS">&nbsp;static int count;</span><br /><span style="font-family: Comic Sans MS">&nbsp;volatile int target = 1;</span><br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m1()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{&nbsp;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;while (target == 2 || target == 3)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("m1() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;target = 2;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br />&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m2()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;while (target == 1 || target == 3)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;System.out.println("m2() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;target = 3;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br />&nbsp;<br /><span style="font-family: Comic Sans MS">&nbsp;synchronized void m3()</span><br /><span style="font-family: Comic Sans MS">&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;for (int i = 0; i &lt; 10; i++)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;while (target == 1 || target == 2)</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;{</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;try {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wait();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;} catch (InterruptedException e) {</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// TODO Auto-generated catch block</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;System.out.println("m3() =" + i);</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;target = 1;</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;&nbsp;notifyAll();</span><br /><span style="font-family: Comic Sans MS">&nbsp;&nbsp;}</span><br /><span style="font-family: Comic Sans MS">&nbsp;}</span><br /><span style="font-family: Comic Sans MS">}</span></p><img src ="http://www.blogjava.net/santicom/aggbug/357783.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-09-02 02:27 <a href="http://www.blogjava.net/santicom/archive/2011/09/02/357783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程的同步与共享</title><link>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 17:38:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357778.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/02/357778.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357778.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357778.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 线程的同步与共享前面程序中的线程都是独立的、异步执行的线程。但在很多情况下，多个线程需要共享数据资源，这就涉及到线程的同步与资源共享的问题。1&nbsp;资源冲突下面的例子说明，多个线程共享资源，如果不加以控制可能会产生冲突。程序CounterTest.java&nbsp;Code highlighting produced by Actipro CodeHighlight...&nbsp;&nbsp;<a href='http://www.blogjava.net/santicom/archive/2011/09/02/357778.html'>阅读全文</a><img src ="http://www.blogjava.net/santicom/aggbug/357778.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-09-02 01:38 <a href="http://www.blogjava.net/santicom/archive/2011/09/02/357778.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>线程的状态与调度</title><link>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 13:43:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357765.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/01/357765.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357765.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357765.html</trackback:ping><description><![CDATA[<h3><span lang="EN-US"><font face="Times New Roman"><span>&nbsp; </span>1,</font></span><span>线程的生命周期</span></h3>
<p style="margin-right: 0px" dir="ltr"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程从创建、运行到结束总是处于下面五个状态之一：新建状态、就绪状态、运行状态、阻塞状态及死亡状态。</p>
<p style="margin-right: 0px" dir="ltr"><img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/santicom/360截图20110901211600850.jpg" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1.新建状态(New)：&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;当用new操作符创建一个线程时， 例如new Thread(r)，线程还没有开始运行，此时线程处在新建状态。 当一个线程处于新生状态时，程序还没有开始运行线程中的代码<br /><br /><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.就绪状态</span><span lang="EN-US">(Runnable)</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;一个新创建的线程并不自动开始运行，要执行线程，必须调用线程的</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法。当线程对象调用</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法即启动了线程，</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法创建线程运行的系统资源，并调度线程运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法。当</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法返回后，线程就处于就绪状态。</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;处于就绪状态的线程并不一定立即运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法，线程还必须同其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，只有获得</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间才可以运行线程。因为在单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>的计算机系统中，不可能同时运行多个线程，一个时刻仅有一个线程处于运行状态。因此此时可能有多个线程处于就绪状态。对多个处于就绪状态的线程是由</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统的线程调度程序</span><span lang="EN-US"><font face="Times New Roman">(<em>thread scheduler</em>)</font></span><span>来调度的。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;3.<font face="Times New Roman"><span>运行状态</span><span lang="EN-US">(Running)</span></font></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span>当线程获得</span><span lang="EN-US">CPU</span><span>时间后，它才进入运行状态，真正开始执行</span><span lang="EN-US">run()</span><span>方法.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><font face="Times New Roman"><span lang="EN-US">4. </span><span>阻塞状态</span><span lang="EN-US">(Blocked)</span></font></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;线程运行过程中，可能由于各种原因进入阻塞状态:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&gt;线程通过调用sleep方法进入睡眠状态；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&gt;线程调用一个在I/O上被阻塞的操作，即该操作在输入输出操作完成之前不会返回到它的调用者；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&gt;线程试图得到一个锁，而该锁正被其他线程持有；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&gt;线程在等待某个触发条件；<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;......&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;所谓阻塞状态是正在运行的线程没有运行结束，暂时让出</span><span lang="EN-US">CPU</span><span>，这时其他处于就绪状态的线程就可以获得</span><span lang="EN-US">CPU</span><span>时间，进入运行状态。<br /><br /><span>&nbsp;&nbsp;&nbsp;&nbsp;5. </span><span>死亡状态</span><span>(Dead)</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;有两个原因会导致线程死亡：<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1) run方法正常退出而自然死亡，<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2) 一个未捕获的异常终止了run方法而使线程猝死。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了确定线程在当前是否存活着（就是要么是可运行的，要么是被阻塞了），需要使用isAlive方法。如果是可运行或被阻塞，这个方法返回true； 如果线程仍旧是new状态且不是可运行的， 或者线程死亡了，则返回false.<br /><br /><br /><br /><br /></p>
<h3><span lang="EN-US"><font face="Times New Roman">2,<span>&nbsp; </span></font></span><span>线程的优先级和调度</span></h3>
<p><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>的每个线程都有一个优先级，当有多个线程处于就绪状态时，线程调度程序根据线程的优先级调度线程运行。</span></p>
<p><span>可以用下面方法设置和返回线程的优先级。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span>&nbsp;</span></span><span lang="EN-US"><font face="Times New Roman">public final void setPriority(int newPriority) </font></span><span>设置线程的优先级。</span></p>
<p><span lang="EN-US"><span>&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span>&nbsp;</span></span><span lang="EN-US"><font face="Times New Roman">public final int getPriority() </font></span><span>返回线程的优先级。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">newPriority</font></span><span>为线程的优先级，其取值为</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span>到</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span>之间的整数，也可以使用</span><span lang="EN-US"><font face="Times New Roman">Thread</font></span><span>类定义的常量来设置线程的优先级，这些常量分别为：</span><span lang="EN-US"><font face="Times New Roman">Thread.MIN_PRIORITY</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">Thread.NORM_PRIORITY</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">Thread.MAX_PRIORITY</font></span><span>，它们分别对应于线程优先级的</span><span lang="EN-US"><font face="Times New Roman">1</font></span><span>、</span><span lang="EN-US"><font face="Times New Roman">5</font></span><span>和</span><span lang="EN-US"><font face="Times New Roman">10</font></span><span>，数值越大优先级越高。当创建</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>线程时，如果没有指定它的优先级，则它从创建该线程那里继承优先级。</span></p>
<p><span>一般来说，只有在当前线程停止或由于某种原因被阻塞，较低优先级的线程才有机会运行。</span></p>
<p><span>前面说过多个线程可并发运行，然而实际上并不总是这样。由于很多计算机都是单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>的，所以一个时刻只能有一个线程运行，多个线程的并发运行只是幻觉。在单</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>机器上多个线程的执行是按照某种顺序执行的，这称为线程的调度</span><span lang="EN-US"><font face="Times New Roman">(<em>scheduling</em>)</font></span><span>。</span></p>
<p><span>大多数计算机仅有一个</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>，所以线程必须与其他线程共享</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>。多个线程在单个</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>是按照某种顺序执行的。实际的调度策略随系统的不同而不同，通常线程调度可以采用两种策略调度处于就绪状态的线程。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(1) </font></span><span>抢占式调度策略</span></p>
<p><span lang="EN-US"><font face="Times New Roman"><span>&nbsp;&nbsp;&nbsp;&nbsp; </span>Java</font></span><span>运行时系统的线程调度算法是抢占式的</span><span lang="EN-US"><font face="Times New Roman"> (<em>preemptive</em>)</font></span><span>。</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统支持一种简单的固定优先级的调度算法。如果一个优先级比其他任何处于可运行状态的线程都高的线程进入就绪状态，那么运行时系统就会选择该线程运行。新的优先级较高的线程抢占</span><span lang="EN-US"><font face="Times New Roman">(<em>preempt</em>)</font></span><span>了其他线程。但是</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统并不抢占同优先级的线程。换句话说，</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>运行时系统不是分时的</span><span lang="EN-US"><font face="Times New Roman">(time-slice)</font></span><span>。然而，基于</span><span lang="EN-US"><font face="Times New Roman">Java Thread</font></span><span>类的实现系统可能是支持分时的，因此编写代码时不要依赖分时。当系统中的处于就绪状态的线程都具有相同优先级时，线程调度程序采用一种简单的、非抢占式的轮转的调度顺序。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(2) </font></span><span>时间片轮转调度策略</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;有些系统的线程调度采用时间片轮转</span><span lang="EN-US">(round-robin)</span><span>调度策略。这种调度策略是从所有处于就绪状态的线程中选择优先级最高的线程分配一定的</span><span lang="EN-US">CPU</span><span>时间运行。该时间过后再选择其他线程运行。只有当线程运行结束、放弃</span><span lang="EN-US">(yield)CPU</span><span>或由于某种原因进入阻塞状态，低优先级的线程才有机会执行。如果有两个优先级相同的线程都在等待</span><span lang="EN-US">CPU</span><span>，则调度程序以轮转的方式选择运行的线程。</p>
<h2><span lang="EN-US"><span><font face="Times New Roman">&nbsp;3. &nbsp;</font></span><span>线程状态的改变</span></h2>
<p><span>一个线程在其生命周期中可以从一种状态改变到另一种状态，线程状态的变迁如图</span><span>所示：<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<img border="0" alt="" src="http://www.blogjava.net/images/blogjava_net/santicom/360截图20110901225907310.jpg" /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br /></span><span lang="EN-US"><font face="Times New Roman">1&gt;<span>&nbsp; </span></font></span><span>控制线程的启动和结束</span></p>
<p><span>当一个新建的线程调用它的</span><span lang="EN-US"><font face="Times New Roman">start()</font></span><span>方法后即进入就绪状态，处于就绪状态的线程被线程调度程序选中就可以获得</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，进入运行状态，该线程就开始运行</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法。</span></p>
<p><span>控制线程的结束稍微复杂一点。如果线程的</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法是一个确定次数的循环，则循环结束后，线程运行就结束了，线程对象即进入死亡状态。如果</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法是一个不确定循环，早期的方法是调用线程对象的</span><span lang="EN-US"><font face="Times New Roman">stop()</font></span><span>方法，然而由于该方法可能导致线程死锁，因此从</span><span lang="EN-US"><font face="Times New Roman">1.1</font></span><span>版开始，不推荐使用该方法结束线程。一般是通过设置一个标志变量，在程序中改变标志变量的值实现结束线程。请看下面的例子：</span></p>
<p><span>程序</span><span><font face="Times New Roman"> <span lang="EN-US">ThreadStop.java</span></font></span><span lang="EN-US"><font face="Times New Roman"></p>
<div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.util.</span><span style="color: #000000">*</span><span style="color: #000000">;<br /><br /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;Timer&nbsp;</span><span style="color: #0000ff">implements</span><span style="color: #000000">&nbsp;Runnable{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">boolean</span><span style="color: #000000">&nbsp;flag</span><span style="color: #000000">=</span><span style="color: #0000ff">true</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">while</span><span style="color: #000000">(flag){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">\r\t</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Date()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000"><img src="http://www.blogjava.net/Images/dot.gif"  alt="" /></span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1000</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(InterruptedException&nbsp;e){}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">\n</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">Thread.currentThread().getName()</span><span style="color: #000000">+</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;Stop</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;stopRun(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;flag&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">false</span><span style="color: #000000">;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;ThreadStop{<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[]){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Timer&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Timer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread&nbsp;thread&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;Thread(timer);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.setName(</span><span style="color: #000000">"</span><span style="color: #000000">Timer</span><span style="color: #000000">"</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;thread.start();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">for</span><span style="color: #000000">(</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i</span><span style="color: #000000">=</span><span style="color: #000000">0</span><span style="color: #000000">;i</span><span style="color: #000000">&lt;</span><span style="color: #000000">100</span><span style="color: #000000">;i</span><span style="color: #000000">++</span><span style="color: #000000">){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(</span><span style="color: #000000">"</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">100</span><span style="color: #000000">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #0000ff">catch</span><span style="color: #000000">(InterruptedException&nbsp;e){}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.stopRun();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /></span></div></font></span>
<p><span>该程序在</span><span lang="EN-US"><font face="Times New Roman">Timer</font></span><span>类中定义了一个布尔变量</span><span lang="EN-US"><font face="Times New Roman">flag</font></span><span>，同时定义了一个</span><span lang="EN-US"><font face="Times New Roman">stopRun()</font></span><span>方法，在其中将该变量设置为</span><span lang="EN-US"><font face="Times New Roman">false</font></span><span>。在主程序中通过调用该方法，从而改变该变量的值，使得</span><span lang="EN-US"><font face="Times New Roman">run()</font></span><span>方法的</span><span lang="EN-US"><font face="Times New Roman">while</font></span><span>循环条件不满足，从而实现结束线程的运行。</span></p>
<p><span>说明</span><font face="Times New Roman"><span lang="EN-US"><span>&nbsp; </span><span>在</span><span lang="EN-US">Thread</span><span>类中除了</span><span lang="EN-US">stop()</span><span>方法被标注为不推荐</span><span lang="EN-US">(deprecated) </span><span>使用外，</span><span lang="EN-US">suspend()</span><span>方法和</span><span lang="EN-US">resume()</span><span>方法也被标明不推荐使用，这两个方法原来用作线程的挂起和恢复.<br /><br /></span></font><span lang="EN-US"><font face="Times New Roman">2&gt;<span>&nbsp; </span></font></span><span>线程阻塞条件</span></p>
<p><span>处于运行状态的线程除了可以进入死亡状态外，还可能进入就绪状态和阻塞状态。下面分别讨论这两种情况：</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(1) </font></span><span>运行状态到就绪状态</span></p>
<p><span>处于运行状态的线程如果调用了</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法，那么它将放弃</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，使当前正在运行的线程进入就绪状态。这时有几种可能的情况：如果没有其他的线程处于就绪状态等待运行，该线程会立即继续运行；如果有等待的线程，此时线程回到就绪状态状态与其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间，当有比该线程优先级高的线程时，高优先级的线程进入运行状态，当没有比该线程优先级高的线程时，但有同优先级的线程，则由线程调度程序来决定哪个线程进入运行状态，因此线程调用</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法只能将</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间让给具有同优先级的或高优先级的线程而不能让给低优先级的线程。</span></p>
<p><span>一般来说，在调用线程的</span><span lang="EN-US"><font face="Times New Roman">yield()</font></span><span>方法可以使耗时的线程暂停执行一段时间，使其他线程有执行的机会。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">(2) </font></span><span>运行状态到阻塞状态</span></p>
<p><span>有多种原因可使当前运行的线程进入阻塞状态，进入阻塞状态的线程当相应的事件结束或条件满足时进入就绪状态。使线程进入阻塞状态可能有多种原因：</span></p>
<p><span>&#9312; </span><span>线程调用了</span><span lang="EN-US"><font face="Times New Roman">sleep()</font></span><span>方法，线程进入睡眠状态，此时该线程停止执行一段时间。当时间到时该线程回到就绪状态，与其他线程竞争</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>时间。</span></p>
<p><span lang="EN-US"><font face="Times New Roman">Thread</font></span><span>类中定义了一个</span><span lang="EN-US"><font face="Times New Roman">interrupt()</font></span><span>方法。一个处于睡眠中的线程若调用了</span><span lang="EN-US"><font face="Times New Roman">interrupt()</font></span><span>方法，该线程立即结束睡眠进入就绪状态。</span></p>
<p><span>&#9313; </span><span>如果一个线程的运行需要进行</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>操作，比如从键盘接收数据，这时程序可能需要等待用户的输入，这时如果该线程一直占用</span><span lang="EN-US"><font face="Times New Roman">CPU</font></span><span>，其他线程就得不到运行。这种情况称为</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>阻塞。这时该线程就会离开运行状态而进入阻塞状态。</span><span lang="EN-US"><font face="Times New Roman">Java</font></span><span>语言的所有</span><span lang="EN-US"><font face="Times New Roman">I/O</font></span><span>方法都具有这种行为。</span></p>
<p><span>&#9314; 有时要求当前线程的执行在另一个线程执行结束后再继续执行，这时可以调用</span><span lang="EN-US"><font face="Times New Roman">join()</font></span><span>方法实现，</span><span lang="EN-US"><font face="Times New Roman">join()</font></span><span>方法有下面三种格式：</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join() throws InterruptedException </font></span><span>使当前线程暂停执行，等待调用该方法的线程结束后再执行当前线程。</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join(long millis) throws InterruptedException </font></span><span>最多等待</span><span lang="EN-US"><font face="Times New Roman">millis</font></span><span>毫秒后，当前线程继续执行。</span></p>
<p><span lang="EN-US"><span>&#183;<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US"><font face="Times New Roman">public void join(long millis, int nanos) throws InterruptedException </font></span><span>可以指定多少毫秒、多少纳秒后继续执行当前线程。</span></p>
<p><span>上述方法使当前线程暂停执行，进入阻塞状态，当调用线程结束或指定的时间过后，当前线程线程进入就绪状态，例如执行下面代码：</span></p>
<p><span lang="EN-US"><font face="Times New Roman">t.join();</font></span></p>
<p><span>将使当前线程进入阻塞状态，当线程</span><span lang="EN-US"><font face="Times New Roman">t</font></span><span>执行结束后，当前线程才能继续执行。</span></p>
<p><span>&#9315; 线程调用了</span><span lang="EN-US"><font face="Times New Roman">wait()</font></span><span>方法，等待某个条件变量，此时该线程进入阻塞状态。直到被通知</span><span lang="EN-US"><font face="Times New Roman">(</font></span><span>调用了</span><span lang="EN-US"><font face="Times New Roman">notify()</font></span><span>或</span><span lang="EN-US"><font face="Times New Roman">notifyAll()</font></span><span>方法</span><span lang="EN-US"><font face="Times New Roman">)</font></span><span>结束等待后，线程回到就绪状态。</span></p>
<p><span>&#9316; </span><span>另外如果线程不能获得对象锁，也进入就绪状态。</span></p>
<p><span>后两种情况在下一节讨论。</span></p>
<p></span><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p></span></span></span></span></span></span></span></span></span></span></span><img src ="http://www.blogjava.net/santicom/aggbug/357765.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-09-01 21:43 <a href="http://www.blogjava.net/santicom/archive/2011/09/01/357765.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>复习下java多线程</title><link>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Thu, 01 Sep 2011 12:46:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/357763.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/09/01/357763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/357763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/357763.html</trackback:ping><description><![CDATA[<div>好久没搞这个了，今天把以前的笔记整理下，当复习。 
<h3><span style="font-size: 12pt">Thread</span><span style="font-family: 黑体; font-size: 12pt">类和</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 黑体; font-size: 12pt">接口</span><span style="font-size: 12pt"></span></h3>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">多线程是一个程序中可以有多段代码同时运行，那么这些代码写在哪里，如何创建线程对象呢</span><span style="font-size: 12pt">?</span></p>
<p><span style="font-family: 宋体; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;首先，我们来看</span><span style="font-size: 12pt">Java</span><span style="font-family: 宋体; font-size: 12pt">语言实现多线程编程的类和接口。在</span><span style="font-size: 12pt">java.lang</span><span style="font-family: 宋体; font-size: 12pt">包中定义了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口和</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类。</span></p>
<p>&nbsp;</p>
<p style="text-indent: 24pt"><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口中只定义了一个方法：</span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt"><span style="font-family: Symbol; font-size: 12pt">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-size: 12pt">public abstract void run() </span></p>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">这个方法要由实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口的类实现。</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">对象称为可运行对象，一个线程的运行就是执行该对象的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法。</span></p>
<p style="text-indent: 24pt"><span style="font-size: 12pt"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread</span><span style="font-family: 宋体; font-size: 12pt">类实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口，因此</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">对象也是可运行对象。同时</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类也是线程类<span style="font-family: 宋体; font-size: 12pt">，该类的常用构造方法如下：</p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread() <o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(Runnable target)<o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(String name)<o:p></o:p></font></span></p>
<p style="line-height: normal; text-indent: -17pt; margin: 0cm 0cm 0pt 38pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt" class="MsoNormal"><span style="font-family: Symbol; font-size: 12pt; mso-fareast-font-family: Symbol; mso-bidi-font-family: Symbol" lang="EN-US"><span style="mso-list: Ignore">&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public Thread(Runnable target, String name)<br /><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">target</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">为线程运行的目标对象，即线程调用</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">start()</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">方法启动后运行那个对象的</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">run()</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">方法，该对象的类型为</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">Runnable</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">，若没有指定目标对象，则以当前类对象为目标对象，</span><span style="font-family: 'Times New Roman'; font-size: 12pt; mso-fareast-font-family: 宋体; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA" lang="EN-US">name</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-font-kerning: 1.0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA; mso-bidi-font-family: 'Times New Roman'">为线程名</span><o:p></o:p></font></span></p>
<p style="text-indent: 24pt"><br /></span><span style="font-size: 12pt"></span></p>
<p style="text-indent: 24pt"></span><span style="font-size: 12pt"></span>&nbsp;</p>
<h2 style="margin: 18pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; </font></span></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">线程的创建</span>&nbsp;</h2>
<p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">介绍下如何创建和运行线程的两种方法。线程运行的代码就是实现了</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口的类的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法或者是</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类的子类的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法，因此构造线程体就有两种方法：<br /></span><span style="font-family: Symbol; font-size: 12pt"><span style="font: 7pt 'Times New Roman'"><span style="font-family: Symbol; font-size: 12pt">&nbsp;&nbsp;&nbsp; &#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span>&nbsp;</span></span><span style="font-family: 宋体; font-size: 12pt">继承</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">类并覆盖它的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法；<br /><span style="font-family: Symbol; font-size: 12pt">&nbsp;&nbsp;&nbsp;&nbsp;&#183;<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span><span style="font-family: 宋体; font-size: 12pt">实现</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口并实现它的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">方法。</p>
<h3 style="margin: 6pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; 1，</font></span></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">继承</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类创建线程</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></h3>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">通过继承</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，并覆盖</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，这时就可以用该类的实例作为线程的目标对象。下面的程序定义了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，它继承了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类并覆盖了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread.java<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class SimpleThread extends Thread{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public SimpleThread(String str){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>super(str);<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>for(int i=0; i&lt;100; i++){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>System.out.println(getName()+" = "+ i);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>try{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;</span>sleep((int)(Math.random()*100));<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;</span>}catch(InterruptedException e){}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>} <o:p></o:p></font></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 2.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">System.out.println(getName()+ " DONE");<o:p></o:p></font></span></p>
<p style="text-indent: 12pt; margin: 0cm 0cm 0pt 31.5pt; mso-char-indent-count: 1.0; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="margin: 0cm 0cm 0pt" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类继承了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Thread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类，并覆盖了</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法，该方法就是线程体。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"> ThreadTest.java<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class ThreadTest{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[]){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t1 = new SimpleThread("Runner A");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t2 = new SimpleThread("Runner B");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t1.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t2.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;</span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">在</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">ThreadTest</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">main()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法中创建了两个</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">SimpleThread</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">类的线程对象并调用线程类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">start()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法启动线程。构造线程时没有指定目标对象，所以线程启动后执行本类的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意，实际上</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">ThreadTest</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序中有三个线程同时运行</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">，在应用程序的</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">main()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法启动时，</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">JVM</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">就创建一个主线程，在主线程中可以创建其他线程。<br /><br /></p>
<h3 style="margin: 6pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">&nbsp; 2，</font></span></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口创建线程</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></h3>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">可以定义一个类实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口，然后将该类对象作为线程的目标对象。实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">接口就是实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">run()</font></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">方法。</span><span style="font-size: 12pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><span style="font-family: 宋体; font-size: 12pt">下面程序通过实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt">接口构造线程体。<span lang="EN-US"><o:p></o:p></span></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt;background: silver; mso-char-indent-count: 2.0" class="MsoBodyText"><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">程序</span><span style="font-size: 12pt"><font face="Times New Roman"> <span lang="EN-US">ThreadTest.java<o:p></o:p></span></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">class T1 implements Runnable{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int i=0;i&lt;15;i++)<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Runner A="+i);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">class T2 implements Runnable{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public void run(){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>for(int j=0;j&lt;15;j++)<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>System.out.println("Runner B="+j);<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">public class ThreadTest{<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>public static void main(String args[]){<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t1=new Thread(new T1(),"Thread A");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>Thread t2=new Thread(new T2(),"Thread B");<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t1.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp; </span>t2.start();<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman"><span style="mso-spacerun: yes">&nbsp; </span>}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 0pt 31.5pt; mso-para-margin-left: 3.0gd" class="1"><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">}<o:p></o:p></font></span></p>
<p style="margin: 0cm 0cm 6pt; mso-para-margin-bottom: .5gd" class="1"><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><font face="Times New Roman">_____________________________________________________________________________</font></span><span style="font-family: 宋体; font-size: 12pt; mso-font-kerning: 0pt">&#9603;</span><span style="font-size: 12pt; mso-font-kerning: 0pt" lang="EN-US"><o:p></o:p></span></p>
<p style="text-indent: 24pt; margin: 0cm 0cm 0pt; mso-char-indent-count: 2.0" class="MsoNormal"><br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><br /><br /></span></p>
<p>&nbsp;</p><br /><br /></div><img src ="http://www.blogjava.net/santicom/aggbug/357763.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-09-01 20:46 <a href="http://www.blogjava.net/santicom/archive/2011/09/01/357763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Content is not allowed in prolog</title><link>http://www.blogjava.net/santicom/archive/2011/04/20/348603.html</link><dc:creator>Jamie</dc:creator><author>Jamie</author><pubDate>Wed, 20 Apr 2011 00:43:00 GMT</pubDate><guid>http://www.blogjava.net/santicom/archive/2011/04/20/348603.html</guid><wfw:comment>http://www.blogjava.net/santicom/comments/348603.html</wfw:comment><comments>http://www.blogjava.net/santicom/archive/2011/04/20/348603.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/santicom/comments/commentRss/348603.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/santicom/services/trackbacks/348603.html</trackback:ping><description><![CDATA[<p>錯誤可能是由XML有中文格式的字符引起的。</p>
<img src ="http://www.blogjava.net/santicom/aggbug/348603.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-04-20 08:43 <a href="http://www.blogjava.net/santicom/archive/2011/04/20/348603.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></channel></rss>