??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久久无码精品亚洲日韩 ,久久亚洲欧洲国产综合,无码亚洲成a人在线观看http://m.tkk7.com/santicom/不要以ؓ......很遥q?/description>zh-cnMon, 12 May 2025 06:01:49 GMTMon, 12 May 2025 06:01:49 GMT60Activity生命周期http://m.tkk7.com/santicom/archive/2011/09/02/357842.htmlJamieJamieFri, 02 Sep 2011 09:48:00 GMThttp://m.tkk7.com/santicom/archive/2011/09/02/357842.htmlhttp://m.tkk7.com/santicom/comments/357842.htmlhttp://m.tkk7.com/santicom/archive/2011/09/02/357842.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/357842.htmlhttp://m.tkk7.com/santicom/services/trackbacks/357842.html现有两个Activity:  Activity1,Activity2

先启动Activity1q行序为: Activity1 onCreate -> Activity1 onStart -> Activity1 onResume
用Intent从Activity1跛_Activity2q行序 Q?nbsp;
Activity1 onPause -> Activity2 onCreate -> Activity2 onStart -> Activity2 onResume ->Activity1 onStop -> Activity1  onDestroy
退出应用程序: Activity2 onResume ->Activity2 onStop -> Activity2  onDestroy



Jamie 2011-09-02 17:48 发表评论
]]>
控制3个线E运行顺序的Demohttp://m.tkk7.com/santicom/archive/2011/09/02/357783.htmlJamieJamieThu, 01 Sep 2011 18:27:00 GMThttp://m.tkk7.com/santicom/archive/2011/09/02/357783.htmlhttp://m.tkk7.com/santicom/comments/357783.htmlhttp://m.tkk7.com/santicom/archive/2011/09/02/357783.html#Feedback2http://m.tkk7.com/santicom/comments/commentRss/357783.htmlhttp://m.tkk7.com/santicom/services/trackbacks/357783.html本程序可以控?个线E按序执行Q?代码如下Q?/span>

public class Test3 {

 public static void main(String[] args) throws IOException {
  final Test obj = new Test();
  
  new Thread()
  {
   public void run()
   {
    obj.m1();
   }
  }.start();
  new Thread()
  {
   public void run()
   {
    obj.m2();
   }
  }.start();
  new Thread()
  {
   public void run()
   {
    obj.m3();
   }
  }.start();
  
 }

}

class Test
{
 static int count;
 volatile int target = 1;
 synchronized void m1()
 { 
   for (int i = 0; i < 10; i++)
   {
    while (target == 2 || target == 3)
    {
     try {
      wait();
     } catch (InterruptedException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
    System.out.println("m1() =" + i);
    target = 2;
    notifyAll();
   }
 }
 
 synchronized void m2()
 {
  for (int i = 0; i < 10; i++)
  {
   while (target == 1 || target == 3)
   {
    try {
     wait();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   System.out.println("m2() =" + i);
   target = 3;
   notifyAll();
  }
 }
 
 synchronized void m3()
 {
  for (int i = 0; i < 10; i++)
  {
   while (target == 1 || target == 2)
   {
    try {
     wait();
    } catch (InterruptedException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }
   }
   System.out.println("m3() =" + i);
   target = 1;
   notifyAll();
  }
 }
}



Jamie 2011-09-02 02:27 发表评论
]]>
U程的同步与׃nhttp://m.tkk7.com/santicom/archive/2011/09/02/357778.htmlJamieJamieThu, 01 Sep 2011 17:38:00 GMThttp://m.tkk7.com/santicom/archive/2011/09/02/357778.htmlhttp://m.tkk7.com/santicom/comments/357778.htmlhttp://m.tkk7.com/santicom/archive/2011/09/02/357778.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/357778.htmlhttp://m.tkk7.com/santicom/services/trackbacks/357778.html阅读全文

Jamie 2011-09-02 01:38 发表评论
]]>
U程的状态与调度http://m.tkk7.com/santicom/archive/2011/09/01/357765.htmlJamieJamieThu, 01 Sep 2011 13:43:00 GMThttp://m.tkk7.com/santicom/archive/2011/09/01/357765.htmlhttp://m.tkk7.com/santicom/comments/357765.htmlhttp://m.tkk7.com/santicom/archive/2011/09/01/357765.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/357765.htmlhttp://m.tkk7.com/santicom/services/trackbacks/357765.html  1,U程的生命周?/span>

        U程从创建、运行到l束L处于下面五个状态之一Q新建状态、就l状态、运行状态、阻塞状态及M状态?/p>



    1.新徏状?New)Q?nbsp;
        当用new操作W创Z个线E时Q?例如new Thread(r)Q线E还没有开始运行,此时U程处在新徏状态?当一个线E处于新生状态时Q程序还没有开始运行线E中的代?br />
     2.qA状?/span>(Runnable)

        一个新创徏的线Eƈ不自动开始运行,要执行线E,必须调用U程?/span>start()Ҏ。当U程对象调用start()Ҏ卛_动了U程Q?/span>start()Ҏ创徏U程q行的系l资源,q调度线E运?/span>run()Ҏ。当start()Ҏq回后,U程处于就l状态?/span>

        处于qA状态的U程q不一定立卌?/span>run()ҎQ线E还必须同其他线E竞?/span>CPU旉Q只有获?/span>CPU旉才可以运行线E。因为在?/span>CPU的计机pȝ中,不可能同时运行多个线E,一个时M有一个线E处于运行状态。因此此时可能有多个U程处于qA状态。对多个处于qA状态的U程是由Javaq行时系l的U程调度E序(thread scheduler)来调度的?br />
    3.q行状?/span>(Running)

        当线E获?/span>CPU旉后,它才q入q行状态,真正开始执?/span>run()Ҏ.

    
4. d状?/span>(Blocked)

        U程q行q程中,可能׃各种原因q入d状?
        1>U程通过调用sleepҎq入睡眠状态;
        2>U程调用一个在I/O上被d的操作,卌操作在输入输出操作完成之前不会返回到它的调用者;
        3>U程试图得到一个锁Q而该锁正被其他线E持有;
        4>U程在等待某个触发条Ӟ
        ......           

        所谓阻塞状态是正在q行的线E没有运行结束,暂时让出
CPUQ这时其他处于就l状态的U程可以获?/span>CPU旉Q进入运行状态?br />
    5. M状?/span>(Dead)

        有两个原因会DU程MQ?br />        1) runҎ正常退自然死亡,
        2) 一个未捕获的异常终止了runҎ而ɾU程猝死?br />        Z定U程在当前是否存zȝQ就是要么是可运行的Q要么是被阻塞了Q,需要用isAliveҎ。如果是可运行或被阻塞,q个Ҏq回trueQ?如果U程仍旧是new状态且不是可运行的Q?或者线E死亡了Q则q回false.




2,  U程的优先和调?/span>

Java的每个线E都有一个优先Q当有多个线E处于就l状态时Q线E调度程序根据线E的优先U调度线E运行?/span>

可以用下面方法设|和q回U程的优先?/span>

    · public final void setPriority(int newPriority) 讄U程的优先?/span>

    · public final int getPriority() q回U程的优先?/span>

newPriority为线E的优先U,其取gؓ1?/span>10之间的整敎ͼ也可以?/span>Threadcd义的帔R来设|线E的优先U,q些帔R分别为:Thread.MIN_PRIORITY?/span>Thread.NORM_PRIORITY?/span>Thread.MAX_PRIORITYQ它们分别对应于U程优先U的1?/span>5?/span>10Q数D大优先񔭑高。当创徏JavaU程Ӟ如果没有指定它的优先U,则它从创U程那里l承优先U?/span>

一般来_只有在当前线E停止或׃某种原因被阻塞,较低优先U的U程才有Zq行?/span>

前面说过多个U程可ƈ发运行,然而实际上q不Lq样。由于很多计机都是?/span>CPU的,所以一个时d能有一个线E运行,多个U程的ƈ发运行只是觉。在?/span>CPU机器上多个线E的执行是按照某U顺序执行的Q这UCؓU程的调?/span>(scheduling)?/span>

大多数计机仅有一?/span>CPUQ所以线E必M其他U程׃nCPU。多个线E在单个CPU是按照某U顺序执行的。实际的调度{略随系l的不同而不同,通常U程调度可以采用两种{略调度处于qA状态的U程?/span>

(1) 抢占式调度策?/span>

     Javaq行时系l的U程调度法是抢占式?/span> (preemptive)?/span>Javaq行时系l支持一U简单的固定优先U的调度法。如果一个优先比其他Q何处于可q行状态的U程都高的线E进入就l状态,那么q行时系l就会选择该线E运行。新的优先较高的线E抢?/span>(preempt)了其他线E。但?/span>Javaq行时系lƈ不抢占同优先U的U程。换句话_Javaq行时系l不是分时的(time-slice)。然而,ZJava Threadcȝ实现pȝ可能是支持分时的Q因此编写代码时不要依赖分时。当pȝ中的处于qA状态的U程都具有相同优先ӞU程调度E序采用一U简单的、非抢占式的轮{的调度顺序?/span>

(2) 旉片轮转调度策?/span>

    有些pȝ的线E调度采用时间片轮{(round-robin)调度{略。这U调度策略是从所有处于就l状态的U程中选择优先U最高的U程分配一定的CPU旉q行。该旉q后再选择其他U程q行。只有当U程q行l束、放?/span>(yield)CPU或由于某U原因进入阻塞状态,低优先的线E才有机会执行。如果有两个优先U相同的U程都在{待CPUQ则调度E序以轮转的方式选择q行的线E?/p>

 3.  U程状态的改变

一个线E在其生命周期中可以从一U状态改变到另一U状态,U程状态的变迁如图所C:

    
    
1>  控制U程的启动和l束

当一个新建的U程调用它的start()Ҏ后即q入qA状态,处于qA状态的U程被线E调度程序选中可以获?/span>CPU旉Q进入运行状态,该线E就开始运?/span>run()Ҏ?/span>

控制U程的结束稍微复杂一炏V如果线E的run()Ҏ是一个确定次数的循环Q则循环l束后,U程q行q束了Q线E对象即q入M状态。如?/span>run()Ҏ是一个不定循环Q早期的Ҏ是调用线E对象的stop()ҎQ然而由于该Ҏ可能DU程死锁Q因此从1.1版开始,不推荐用该Ҏl束U程。一般是通过讄一个标志变量,在程序中改变标志变量的值实现结束线E。请看下面的例子Q?/span>

E序 ThreadStop.java

import java.util.*;

class Timer implements Runnable{

    
boolean flag=true;
    
public void run(){
      
while(flag){
        System.out.print(
"\r\t"+new Date()+"");
        
try{
              Thread.sleep(
1000);
        }
catch(InterruptedException e){} 
      }
      System.out.println(
"\n"+Thread.currentThread().getName()+" Stop");
    }

    
public void stopRun(){
           flag 
= false;
    }
}

public class ThreadStop{
    
public static void main(String args[]){
       Timer timer 
= new Timer();
       Thread thread 
= new Thread(timer);       
       thread.setName(
"Timer");
       thread.start();

       
for(int i=0;i<100;i++){
         System.out.print(
"\r"+i);
        
try{
              Thread.sleep(
100);
        }
catch(InterruptedException e){} 
       }     
       timer.stopRun();
    }
}

该程序在TimercM定义了一个布变?/span>flagQ同时定义了一?/span>stopRun()ҎQ在其中该变量讄?/span>false。在ȝ序中通过调用该方法,从而改变该变量的|使得run()Ҏ?/span>while循环条g不满I从而实现结束线E的q行?/span>

说明  ?/span>ThreadcM除了stop()Ҏ被标注ؓ不推?/span>(deprecated) 使用外,suspend()Ҏ?/span>resume()Ҏ也被标明不推荐用,q两个方法原来用作线E的挂v和恢?

2>  U程d条g

处于q行状态的U程除了可以q入M状态外Q还可能q入qA状态和d状态。下面分别讨两种情况Q?/span>

(1) q行状态到qA状?/span>

处于q行状态的U程如果调用?/span>yield()ҎQ那么它放?/span>CPU旉Q当前正在q行的线E进入就l状态。这时有几种可能的情况:如果没有其他的线E处于就l状态等待运行,该线E会立即l箋q行Q如果有{待的线E,此时U程回到qA状态状态与其他U程竞争CPU旉Q当有比该线E优先高的U程Ӟ高优先的线E进入运行状态,当没有比该线E优先高的U程Ӟ但有同优先的线E,则由U程调度E序来决定哪个线E进入运行状态,因此U程调用yield()Ҏ只能?/span>CPU旉让给h同优先的或高优先的线E而不能让l低优先U的U程?/span>

一般来_在调用线E的yield()Ҏ可以使耗时的线E暂停执行一D|_使其他线E有执行的机会?/span>

(2) q行状态到d状?/span>

有多U原因可使当前运行的U程q入d状态,q入d状态的U程当相应的事gl束或条件满xq入qA状态。ɾU程q入d状态可能有多种原因Q?/span>

U程调用?/span>sleep()ҎQ线E进入睡眠状态,此时该线E停止执行一D|间。当旉到时该线E回到就l状态,与其他线E竞?/span>CPU旉?/span>

ThreadcM定义了一?/span>interrupt()Ҏ。一个处于睡眠中的线E若调用?/span>interrupt()ҎQ该U程立即l束睡眠q入qA状态?/span>

如果一个线E的q行需要进?/span>I/O操作Q比如从键盘接收数据Q这时程序可能需要等待用L输入Q这时如果该U程一直占?/span>CPUQ其他线E就得不到运行。这U情늧?/span>I/Od。这时该U程׃dq行状态而进入阻塞状态?/span>Java语言的所?/span>I/OҎ都具有这U行为?/span>

③ 有时要求当前U程的执行在另一个线E执行结束后再l执行,q时可以调用join()Ҏ实现Q?/span>join()Ҏ有下面三U格式:

·         public void join() throws InterruptedException 使当前线E暂停执行,{待调用该方法的U程l束后再执行当前U程?/span>

·         public void join(long millis) throws InterruptedException 最多等?/span>millis毫秒后,当前U程l箋执行?/span>

·         public void join(long millis, int nanos) throws InterruptedException 可以指定多少毫秒、多纳U后l箋执行当前U程?/span>

上述Ҏ使当前线E暂停执行,q入d状态,当调用线E结束或指定的时间过后,当前U程U程q入qA状态,例如执行下面代码Q?/span>

t.join();

当前U程q入d状态,当线E?/span>t执行l束后,当前U程才能l箋执行?/span>

④ U程调用?/span>wait()ҎQ等待某个条件变量,此时该线E进入阻塞状态。直到被通知(调用?/span>notify()?/span>notifyAll()Ҏ)l束{待后,U程回到qA状态?/span>

另外如果U程不能获得对象锁,也进入就l状态?/span>

后两U情况在下一节讨论?/span>





















Jamie 2011-09-01 21:43 发表评论
]]>
复习下java多线E?/title><link>http://m.tkk7.com/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://m.tkk7.com/santicom/archive/2011/09/01/357763.html</guid><wfw:comment>http://m.tkk7.com/santicom/comments/357763.html</wfw:comment><comments>http://m.tkk7.com/santicom/archive/2011/09/01/357763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/santicom/comments/commentRss/357763.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/santicom/services/trackbacks/357763.html</trackback:ping><description><![CDATA[<div>好久没搞q个了,今天把以前的W记整理下,当复习? <h3><span style="font-size: 12pt">Thread</span><span style="font-family: 黑体; font-size: 12pt">cd</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">多线E是一个程序中可以有多D代码同时运行,那么q些代码写在哪里Q如何创建线E对象呢</span><span style="font-size: 12pt">?</span></p> <p><span style="font-family: 宋体; font-size: 12pt">    首先Q我们来?/span><span style="font-size: 12pt">Java</span><span style="font-family: 宋体; font-size: 12pt">语言实现多线E编E的cd接口。在</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">cR?/span></p> <p> </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">·<span style="font: 7pt 'Times New Roman'">         </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">q个Ҏ要由实现?/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">对象UCؓ可运行对象,一个线E的q行是执行该对象的</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 />      Thread</span><span style="font-family: 宋体; font-size: 12pt">cdC</span><span style="font-size: 12pt">Runnable</span><span style="font-family: 宋体; font-size: 12pt">接口Q因?/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">cM是线E类<span style="font-family: 宋体; font-size: 12pt">Q该cȝ常用构造方法如下:</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">·<span style="font: 7pt 'Times New Roman'">         </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">·<span style="font: 7pt 'Times New Roman'">         </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">·<span style="font: 7pt 'Times New Roman'">         </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">·<span style="font: 7pt 'Times New Roman'">         </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'">为线E运行的目标对象Q即U程调用</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'">ҎQ该对象的类型ؓ</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'">Q若没有指定目标对象Q则以当前类对象为目标对象,</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'">为线E名</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> </p> <h2 style="margin: 18pt 0cm"><span style="font-size: 12pt" lang="EN-US"><span style="mso-spacerun: yes"><font face="Times New Roman">  </font></span></span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">U程的创?/span> </h2> <p style="text-indent: 24pt"><span style="font-family: 宋体; font-size: 12pt">介绍下如何创建和q行U程的两U方法。线E运行的代码是实现?/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">cȝ子类?/span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">ҎQ因此构造线E体有两种ҎQ?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">    ·<span style="font: 7pt 'Times New Roman'">        </span></span> </span></span><span style="font-family: 宋体; font-size: 12pt">l承</span><span style="font-size: 12pt">Thread</span><span style="font-family: 宋体; font-size: 12pt">cdƈ覆盖它的</span><span style="font-size: 12pt">run()</span><span style="font-family: 宋体; font-size: 12pt">ҎQ?br /><span style="font-family: Symbol; font-size: 12pt">    ·<span style="font: 7pt 'Times New Roman'">        </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">接口q实现它?/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">  1Q?/font></span></span><span style="font-family: 黑体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">l承</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'">cd建线E?/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'">通过l承</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'">c,q覆?/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'">ҎQ这时就可以用该cȝ实例作ؓU程的目标对象。下面的E序定义?/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'">c,它承了</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'">cdƈ覆盖?/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'">E序</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">  </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">  </span><span style="mso-spacerun: yes">  </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">  </span><span style="mso-spacerun: yes">  </span>for(int i=0; i<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">    </span><span style="mso-spacerun: yes">  </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">  </span><span style="mso-spacerun: yes">  </span><span style="mso-spacerun: yes">  </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">     </span><span style="mso-spacerun: yes">    </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">    </span><span style="mso-spacerun: yes">  </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">    </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">▃</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">    </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'">cȝ承了</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'">c,q覆盖了</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'">ҎQ该Ҏ是U程体?/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'">E序</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">  </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">    </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">    </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">    </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">    </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"> </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">▃</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'">cȝ</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'">Ҏ中创Z两个</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'">cȝU程对象q调用线E类?/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'">Ҏ启动U程。构造线E时没有指定目标对象Q所以线E启动后执行本类?/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'">注意Q实际上</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'">E序中有三个U程同时q行</span><span style="font-family: 宋体; font-size: 12pt; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">Q在应用E序?/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'">创Z个主U程Q在ȝE中可以创徏其他U程?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">  2Q?/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'">接口创徏U程</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'">接口Q然后将该类对象作ؓU程的目标对象。实?/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">下面E序通过实现</span><span style="font-size: 12pt" lang="EN-US"><font face="Times New Roman">Runnable</font></span><span style="font-family: 宋体; font-size: 12pt">接口构造线E体?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'">E序</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">  </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">    </span>for(int i=0;i<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">      </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">  </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">  </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">    </span>for(int j=0;j<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">      </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">  </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">  </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">    </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">    </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">    </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">    </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">  </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">▃</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 />    </span><br /><br /></span></p> <p> </p><br /><br /></div><img src ="http://m.tkk7.com/santicom/aggbug/357763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/santicom/" target="_blank">Jamie</a> 2011-09-01 20:46 <a href="http://m.tkk7.com/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 prologhttp://m.tkk7.com/santicom/archive/2011/04/20/348603.htmlJamieJamieWed, 20 Apr 2011 00:43:00 GMThttp://m.tkk7.com/santicom/archive/2011/04/20/348603.htmlhttp://m.tkk7.com/santicom/comments/348603.htmlhttp://m.tkk7.com/santicom/archive/2011/04/20/348603.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/348603.htmlhttp://m.tkk7.com/santicom/services/trackbacks/348603.html錯誤可能是由XML有中文格式的字符引v的?/p>

Jamie 2011-04-20 08:43 发表评论
]]>
JTree用法http://m.tkk7.com/santicom/archive/2011/03/23/346796.htmlJamieJamieWed, 23 Mar 2011 00:32:00 GMThttp://m.tkk7.com/santicom/archive/2011/03/23/346796.htmlhttp://m.tkk7.com/santicom/comments/346796.htmlhttp://m.tkk7.com/santicom/archive/2011/03/23/346796.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/346796.htmlhttp://m.tkk7.com/santicom/services/trackbacks/346796.htmlimport  java.awt.Dimension;
import  java.awt.Color;
import  javax.swing.JFrame;
import  javax.swing.JPanel;
import  javax.swing.JScrollPane;
import  javax.swing.JTree;
import  javax.swing.BoxLayout;
import  javax.swing.tree.TreePath;
import  javax.swing.tree.DefaultMutableTreeNode;
import  javax.swing.tree.DefaultTreeModel;
/*
JTree的构造函?
JTree()
JTree(Hashtable value)
JTree(Object[] value)//只有q个构造函数可以创建多个根l点
JTree(TreeModel newModel)
JTree(TreeNode root)
JTree(TreeNode root, boolean asksAllowsChildren)
JTree(Vector value)

*/
public   class  JTreeDemo
{
 
public   static   void  main (String[] args)
 {


  
// 构造函敎ͼJTree()
  JTree example1  =   new  JTree();

 

  
  
// 构造函敎ͼJTree(Object[] value)
  Object[] letters =  { " a " " b " " c " " d " " e " };
  JTree example2 
=   new  JTree (letters);

 


  
// 构造函敎ͼJTree(TreeNode root)(TreeNodeI?
  
// 用空l点创徏?/span>
  DefaultMutableTreeNode node1  =   new  DefaultMutableTreeNode(); // 定义树结?/span>
  JTree example3  =   new  JTree (node1); // 用此树结点做参数调用 JTree的构造函数创建含有一个根l点的树

 


  
// 构造函敎ͼJTree(TreeNode root)(同上,只是TreeNode非空)
  
// 用一个根l点创徏?/span>
  DefaultMutableTreeNode node2  =   new  DefaultMutableTreeNode( " Color " );
  JTree example4 
=   new  JTree (node2); // l点不可以颜?默认为白面黑?/span>
  example4.setBackground (Color.lightGray);

 


  
// 构造函敎ͼJTree(TreeNode root, boolean asksAllowsChildren)(同上,只是TreeNode又有不同)
  
// 使用DefaultMutableTreeNodecd用一个根l点创徏树,讄为可d孩子l点,再添加孩子结?/span>
  DefaultMutableTreeNode color  =   new  DefaultMutableTreeNode( " Color " true );
  DefaultMutableTreeNode gray 
=   new  DefaultMutableTreeNode ( " Gray " );
  color.add (gray);
  color.add (
new  DefaultMutableTreeNode ( " Red " ));
  gray.add (
new  DefaultMutableTreeNode ( " Lightgray " ));
  gray.add (
new  DefaultMutableTreeNode ( " Darkgray " ));
  color.add (
new  DefaultMutableTreeNode ( " Green " ));
  JTree example5 
=   new  JTree (color);
  
  
  
  
  
// 构造函敎ͼJTree(TreeNode root)(同上,只是TreeNode非空)
  
// 通过逐个dl点创徏?/span>
  DefaultMutableTreeNode biology  =   new  DefaultMutableTreeNode ( " Biology " );
  DefaultMutableTreeNode animal 
=   new  DefaultMutableTreeNode ( " Animal " );
  DefaultMutableTreeNode mammal 
=   new  DefaultMutableTreeNode ( " Mammal " );
  DefaultMutableTreeNode horse 
=   new  DefaultMutableTreeNode ( " Horse " );
  mammal.add (horse);
  animal.add (mammal);
  biology.add (animal);
  JTree example6 
=   new  JTree (biology);
  horse.isLeaf();
  horse.isRoot();
  
  


  
// 构造函?JTree(TreeModel newModel)
  
// 用DefaultMutableTreeNodelcd义一个结点再用这个结点做参数定义一个用DefaultTreeMode
  
// 创徏一个树的模?再用JTree的构造函数创Z个树
  
  DefaultMutableTreeNode root 
=   new  DefaultMutableTreeNode ( " Root1 " );
  DefaultMutableTreeNode child1 
=   new  DefaultMutableTreeNode ( " Child1 " );
  DefaultMutableTreeNode child11 
=   new  DefaultMutableTreeNode ( " Child11 " );
  DefaultMutableTreeNode child111 
=   new  DefaultMutableTreeNode ( " Child111 " );
  root.add (child1); child1.add (child11); child11.add (child111);
  
  
  
  DefaultTreeModel model 
=   new  DefaultTreeModel (root);
  
  JTree example7 
=   new  JTree (model);

 

  JPanel panel 
=   new  JPanel();
  panel.setLayout (
new  BoxLayout (panel, BoxLayout.X_AXIS));
  panel.setPreferredSize (
new  Dimension ( 700 400 ));
  panel.add (
new  JScrollPane (example1)); // JTree必须攑֜JScrollPane?/span>
  panel.add ( new  JScrollPane (example2));
  panel.add (
new  JScrollPane (example3));
  panel.add (
new  JScrollPane (example4));
  panel.add (
new  JScrollPane (example5));
  panel.add (
new  JScrollPane (example6));
  panel.add (
new  JScrollPane (example7));
  

 

  JFrame frame 
=   new  JFrame ( " JTreeDemo " );
  frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
  frame.setContentPane (panel);
  frame.pack();
  frame.show();
 }
}
××××××××××××××××××××××××××××××××××××××××××××××

在实际开发过E中会经怋用JTreelgQ^时会遇到q样或那L问题Q在此将偶得一点经验写下来Q与大家׃nQ希望对大家有所帮助?/p>

private JTree jtNetDevice;//数组件申?br /> private JScrollPane jspTree;//滚动面板x


1、初始化
    DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("root");
    jtNetDevice = new JTree(rootNode);
    jtNetDevice.setAutoscrolls(true);
    getTreeSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);//讄单选模?br />     jspTree = new JScrollPane();
    jspTree.getViewport().add(jtNetDevice, null);

2、三个经怋用的取值函?/strong>
  private DefaultTreeModel getTreeModel(){
    return (DefaultTreeModel)jtNetDevice.getModel();
  }

  private DefaultMutableTreeNode getRootNode(){
    return (DefaultMutableTreeNode)getTreeModel().getRoot();
  }
 
  private TreeSelectionModel getTreeSelectionModel(){
    return jtNetDevice.getSelectionModel();
  }
 

3、根据node得到pathQ?br />   TreePath visiblePath = new TreePath(getTreeModel().getPathToRoot(node));

4、根据Path展开到该节点
  jtNetDevice.makeVisible(visiblePath);

5、根据path讑֮该节炚w定
  jtNetDevice.setSelectionPath(visiblePath);

6、选中节点的方?br />   首先Q根据节点得到树路径Q其中chosen为需要选中的节?br />   TreePath visiblePath = new TreePath( ( (DefaultTreeModel) jtNetDevice.getModel()).
                                        getPathToRoot(chosen));
  然后ҎPath选中该节?br />   jtNetDevice.setSelectionPath(visiblePath);

7、滚动到可见位置
  jtNetDevice.scrollPathToVisible(visiblePath);

8、给JTreed右键弹出菜单
  void jtNetDevice_mouseReleased(MouseEvent e) {
    if (e.isPopupTrigger()) {
      jPopupMenu1.show(e.getComponent(), e.getX(), e.getY());//弹出右键菜单
    }
  }

9、关于JTree的展开
   // If expand is true, expands all nodes in the tree.
   // Otherwise, collapses all nodes in the tree.
   public void expandAll(JTree tree, boolean expand) {
       TreeNode root = (TreeNode)tree.getModel().getRoot();
  
       // Traverse tree from root
       expandAll(tree, new TreePath(root), expand);
   }
   private void expandAll(JTree tree, TreePath parent, boolean expand) {
       // Traverse children
       TreeNode node = (TreeNode)parent.getLastPathComponent();
       if (node.getChildCount() >= 0) {
           for (Enumeration e=node.children(); e.hasMoreElements(); ) {
               TreeNode n = (TreeNode)e.nextElement();
               TreePath path = parent.pathByAddingChild(n);
               expandAll(tree, path, expand);
           }
       }
  
       // Expansion or collapse must be done bottom-up
       if (expand) {
           tree.expandPath(parent);
       } else {
           tree.collapsePath(parent);
       }
   }
 

10、如何遍历JTree
   // 创徏?br />    JTree tree = new JTree();
  
   // d树节?.....
  
   // 遍历所有节?br />    visitAllNodes(tree);
  
   // 仅遍历展开的节?br />    visitAllExpandedNodes(tree);
  
   // Traverse all nodes in tree
   public void visitAllNodes(JTree tree) {
       TreeNode root = (TreeNode)tree.getModel().getRoot();
       visitAllNodes(root);
   }
   public void visitAllNodes(TreeNode node) {
       // node is visited exactly once
       process(node);
  
       if (node.getChildCount() >= 0) {
           for (Enumeration e=node.children(); e.hasMoreElements(); ) {
               TreeNode n = (TreeNode)e.nextElement();
               visitAllNodes(n);
           }
       }
   }
  
   // Traverse all expanded nodes in tree
   public void visitAllExpandedNodes(JTree tree) {
       TreeNode root = (TreeNode)tree.getModel().getRoot();
       visitAllExpandedNodes(tree, new TreePath(root));
   }
   public void visitAllExpandedNodes(JTree tree, TreePath parent) {
       // Return if node is not expanded
       if (!tree.isVisible(parent)) {
           return;
       }
  
       // node is visible and is visited exactly once
       TreeNode node = (TreeNode)parent.getLastPathComponent();
       process(node);
  
       // Visit all children
       if (node.getChildCount() >= 0) {
           for (Enumeration e=node.children(); e.hasMoreElements(); ) {
               TreeNode n = (TreeNode)e.nextElement();
               TreePath path = parent.pathByAddingChild(n);
               visitAllExpandedNodes(tree, path);
           }
       }
   }


posted on 2006-04-04 17:24 SIMONE 阅读(9202) 评论(1)  ~辑  收藏 所属分c? JAVA


Jamie 2011-03-23 08:32 发表评论
]]>
GridBagLayout 2http://m.tkk7.com/santicom/archive/2011/03/18/346534.htmlJamieJamieFri, 18 Mar 2011 06:27:00 GMThttp://m.tkk7.com/santicom/archive/2011/03/18/346534.html 

今天l于耐着性子弄懂了GridBagLayout是怎么使用的?br /> 构造函敎ͼ
    GirdBagLayout()建立一个新的GridBagLayout理器?br />     GridBagConstraints()建立一个新的GridBagConstraints对象?br />     GridBagConstraints(int gridx,int gridy,
                                   int gridwidth,int gridheight,
                                   double weightx,double weighty,
                                   int anchor,int fill, Insets insets,
                                   int ipadx,int ipady)建立一个新的GridBagConstraints对象Qƈ指定其参数的倹{?br /> 看着q一堆的参数快烦死了,下面׃解一下参数的意思:

参数说明Q?br />  gridx,gridy    —?nbsp;   讄lg的位|,
                   gridx讄为GridBagConstraints.RELATIVE代表此组件位于之前所加入lg的右辏V?br />                    gridy讄为GridBagConstraints.RELATIVE代表此组件位于以前所加入lg的下面?br />                   定义出gridx,gridy的位|以便以后维护程序。gridx=0,gridy=0时放??列?/p>

 gridwidth,gridheight    —?nbsp;   用来讄lg所占的单位长度与高度,默认值皆??br />                  你可以用GridBagConstraints.REMAINDER帔RQ代表此lg为此行或此列的最后一个组Ӟ而且会占据所有剩余的I间?/p>

 weightx,weighty    —?nbsp;   用来讄H口变大Ӟ各组件跟着变大的比例?br />                 当数字越大,表示lg能得到更多的I间Q默认值皆??/p>

 anchor    —?nbsp;   当组件空间大于组件本w时Q要组件置于何处?br />                有CENTER(默认?、NORTH、NORTHEAST、EAST、SOUTHEAST、WEST、NORTHWEST选择?/p>

 insets    —?nbsp;   讄lg之间彼此的间距?br />               它有四个参数Q分别是上,左,下,叻I默认?0,0,0,0)?/p>

ipadx,ipady    —?nbsp;   讄lg间距Q默认gؓ0?/p>

GridBagLayout里的各种讄都必通过GridBagConstraintsQ因此当我们GridBagConstraints的参数都讄
好了之后Q必new一个GridBagConstraints的对象出来,以便GridBagLayout使用?/p>

代码片断Q?br />        JButton b;
      GridBagConstraints c;
      int gridx,gridy,gridwidth,gridheight,anchor,fill,ipadx,ipady;
      double weightx,weighty;
      Insets inset;
     
      JFrame f=new JFrame();
     
      GridBagLayout gridbag=new GridBagLayout();
      Container contentPane=f.getContentPane();
      contentPane.setLayout(gridbag);
       
        b=new JButton("first");
        gridx=0;
        gridy=0;
        gridwidth=1;
        gridheight=1;
        weightx=10;
        weighty=1;
        anchor=GridBagConstraints.CENTER;
        fill=GridBagConstraints.HORIZONTAL;
        inset=new Insets(0,0,0,0);
        ipadx=0;
        ipady=0;
        c=new GridBagConstraints(gridx,gridy,gridwidth,gridheight,weightx,weighty,anchor,fill,inset,ipadx,ipady);
        gridbag.setConstraints(b,c);
        contentPane.add(b);


GridBagLayoutq种理器是十分灉|的,只不q他写v来比较麻烦,不过用了之后才发C对界面的部v帮助很大?br />  


本文来自CSDN博客Q{载请标明出处Qhttp://blog.csdn.net/dracularking/archive/2008/04/22/2314336.aspx



Jamie 2011-03-18 14:27 发表评论
]]>
GridBagLayouthttp://m.tkk7.com/santicom/archive/2011/02/24/345042.htmlJamieJamieThu, 24 Feb 2011 02:32:00 GMThttp://m.tkk7.com/santicom/archive/2011/02/24/345042.htmlhttp://m.tkk7.com/santicom/comments/345042.htmlhttp://m.tkk7.com/santicom/archive/2011/02/24/345042.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/345042.htmlhttp://m.tkk7.com/santicom/services/trackbacks/345042.html下面的是q个界面的一个原始草图:

 

正如你所看到的,最l的l果看上d计划的想法完全一栗?/p>

     你应该能看到在草N有一些线Q这些线是用来把ȝ面分成若q行和列的,q样你就很清楚每一个组件放|的格子位置。这是GridBagLayout??的那一部分Q而图上的数字是格的L?/p>

在某U意义上? 我们可以把GridBagLayout惌成ؓ早些q的HTML3?Q它们都是基于表的布局QGrid的概念就cMrowspan和colspan的意思,只不q换了个名字|了?/p>

随着我们的界面和表格的设|完成,是时候该q行界面布局q开始写代码了?/p>

工作q程

q一节我假定你已l了解了基本的窗口和lg创徏知识?/p>

通过q篇文章我们最l能在一个frame中布局lgQ我们将在以后的文章对界面进行改q它更适用。因?Z了解q整个工作的q程Q我们列Z所有的目标代码?/p>

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GridBagWindow extends JFrame {
private JButton searchBtn;
private JComboBox modeCombo;
private JLabel tagLbl;
private JLabel tagModeLbl;
private JLabel previewLbl;
private JTable resTable;
private JTextField tagTxt;
public GridBagWindow() {
Container contentPane = getContentPane();
GridBagLayout gridbag = new GridBagLayout();
contentPane.setLayout(gridbag);
GridBagConstraints c = new GridBagConstraints();
//setting a default constraint value
c.fill =GridBagConstraints.HORIZONTAL;
tagLbl = new JLabel("Tags");
c.gridx = 0; //x grid position
c.gridy = 0; //y grid position
gridbag.setConstraints(tagLbl, c); //associate the label with a constraint object
contentPane.add(tagLbl); //add it to content pane
tagModeLbl = new JLabel("Tag Mode");
c.gridx = 0;
c.gridy = 1;
gridbag.setConstraints(tagModeLbl, c);
contentPane.add(tagModeLbl);
tagTxt = new JTextField("plinth");
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 2;
gridbag.setConstraints(tagTxt, c);
contentPane.add(tagTxt);
String[] options = {"all", "any"};
modeCombo = new JComboBox(options);
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 1;
gridbag.setConstraints(modeCombo, c);
contentPane.add(modeCombo);
searchBtn = new JButton("Search");
c.gridx = 1;
c.gridy = 2;
gridbag.setConstraints(searchBtn, c);
contentPane.add(searchBtn);
resTable = new JTable(5,3);
c.gridx = 0;
c.gridy = 3;
c.gridwidth = 3;
gridbag.setConstraints(resTable, c);
contentPane.add(resTable);
previewLbl = new JLabel("Preview goes here");
c.gridx = 0;
c.gridy = 4;
gridbag.setConstraints(previewLbl, c);
contentPane.add(previewLbl);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String args[]) {
GridBagWindow window = new GridBagWindow();
window.setTitle("GridBagWindow");
window.pack();
window.setVisible(true);
}
}

 

构造方法前的代码都不是很特D,都是一些相当标准的import和变量定义。但是进入构造方法后Q事情就变得有趣了?/p>

Container contentPane = getContentPane();

GridBagLayout gridbag = new GridBagLayout();

contentPane.setLayout(gridbag);

     我们以GridBagWindow的内定w板作为开始来创徏一个GridBagLayout对象Q准地_q个Ҏ与过L们所创徏 GridLayout对象和BorderLayout对象的方法是一L。那么,现在我们开始来讄GridBagLayout对象使它作ؓ内容面板?布局?/p>

GridBagConstraints c = new GridBagConstraints();

     然后我要提到q整个进E中的一个独特的对象Q那是GridBagConstraints。这个对象在GridBagLayout中控制所 有被安置在其中组件的U束。ؓ了把一个组件增加到你的GridBagLayout中去Q你首先必须它与一个GridBagConstraints对象?立连接?/p>

GridBagConstraints可以?1个方面来q行控制和操U,也可以给你提供一些帮助。这些内ҎQ?/p>

  • Gridx——组件的横向坐标
  • Girdy——组件的U向坐标
  • Gridwidth——组件的横向宽度Q也是指组件占用的列数Q这与HTML的colspancM
  • Gridheight——组件的U向长度Q也是指组件占用的行数Q这与HTML的rowspancM
  • Weightx——指行的权重Q告诉布局理器如何分配额外的水^I间
  • Weighty——指列的权重Q告诉布局理器如何分配额外的垂直I间
  • Anchor——告诉布局理器组件在表格I间中的位置
  • Fill——如果显C区域比lg的区域大的时候,可以用来控制lg的行为。控制组件是垂直填充Q还是水q_充,或者两个方向一起填?
  • Insets——指lg与表格空间四周边~的I白区域的大?
  • Ipadx—?strong> lg间的横向间距,lg的宽度就是这个组件的最宽度加上ipadx?
  • ipady—?strong> lg间的U向间距,lg的高度就是这个组件的最高度加上ipady?

     可能对于一个组件的每一个实例你都需要ؓ它徏立一个单独的GridBagConstraintsQ然而,q种Ҏ我们q不推荐使用。最好的Ҏ是,当你调用它的时候把对象讄为默认|然后针对于每一个组件改变其相应的域?/p>

     q个Ҏh通用性,因ؓ在一些域中,比如insets、padx、pady和fillq些域,对于每一个组件来说一般都是相同的Q因此这样对一个域q行讄׃更轻松了Q也能更L的在另外的组件中改变某些域的倹{?/p>

     如果在改变了某些域g后,你想回到原始的域值的话,你应该在增加下一个组件之前进行改变。这U方法你更Ҏ明白你正在修改的内容Q也能你更Ҏ明白在一q串对象中的q?1个参数的作用?/p>

     也许你现在对q些内容q是一知半解,不过事实上一旦你理解了GridBagConstraintsQ值得安慰的是你以后做再困隄工作都会游刃有余了?/p>

所以,如果我们已经明白了GridBagConstraints的详l用法了Q那么现在就让我们来看看在实际应用中应该如何来实现它Q?/p>

tagLbl = new JLabel("Tags");
c.gridx = 0; //x grid position
c.gridy = 0; //y grid position
gridbag.setConstraints(tagLbl, c); //讄标签的限?/p>

contentPane.add(tagLbl); //增加到内定w?/p>

我们所做的是示例我们的标签、分配给它一个格位置Q将它与一个约束对象联pv来ƈ把它增加到我们的内容面板中?/p>

tagModeLbl = new JLabel("Tag Mode");
c.gridx = 0;
c.gridy = 1;
gridbag.setConstraints(tagModeLbl, c);

contentPane.add(tagModeLbl);

   h意,虽然我们已经在我们的U束对象中把gridx的D|ؓ0Q但是在q里我们仍然要对它进行重新设|——这样做没有其它原因Q只是ؓ了增加可L?/p>

     下面Q我们增加一个文本域以便能存储我们希望能搜烦到的关键字,再增加一个组合框以便用来搜烦多个关键字。除了我们希望的文本域有两列之外Q这个概念其他的斚w都与上面所说的是相同的Q所以,我们需要在增加l合框之前重新设|文本域的倹{?/p>

tagTxt = new JTextField("plinth");
c.gridx = 1;
c.gridy = 0;
c.gridwidth = 2;
gridbag.setConstraints(tagTxt, c);
contentPane.add(tagTxt);

String[] options = {"all", "any"};
modeCombo = new JComboBox(options);
c.gridx = 1;
c.gridy = 1;
c.gridwidth = 1;
gridbag.setConstraints(modeCombo, c);
contentPane.add(modeCombo);

       做了q些之后Q我们再在内定w板中增加一些其余的单组Ӟq时候我们就能够览它了Q其余的代码应该不会出现M问题了?/p>

到这个阶D,我们应该已经得到了一个类g我们先前所设计的界面了?/p>



Jamie 2011-02-24 10:32 发表评论
]]>
JComboBoxhttp://m.tkk7.com/santicom/archive/2011/02/17/344487.htmlJamieJamieThu, 17 Feb 2011 00:24:00 GMThttp://m.tkk7.com/santicom/archive/2011/02/17/344487.htmlhttp://m.tkk7.com/santicom/comments/344487.htmlhttp://m.tkk7.com/santicom/archive/2011/02/17/344487.html#Feedback0http://m.tkk7.com/santicom/comments/commentRss/344487.htmlhttp://m.tkk7.com/santicom/services/trackbacks/344487.html cdơ结构图Q?br />    java.lang.Object
    --java.awt.Component
     --java.awt.Container
      --javax.swing.JComponent
       --javax.swing.JComboBox
   构造函敎ͼ
    JComboBox():建立一个新的JComboBoxlg?br />     JComboBox(ComboBoxModel aModel):用ListModel建立一个新的JComboBoxlg?br />     JComboBox(Object[] items):利用Array对象建立一个新的JComboBoxlg?br />     JComboBox(Vector items):利用Vector对象建立一个新的JComboBoxlg?
7-4-1:建立一般的JComboBox:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.Vector;

public class JComboBox1{
public static void main(String[] args){
JFrame f=new JFrame("JComboBox1");
Container contentPane=f.getContentPane();
contentPane.setLayout(new GridLayout(1,2));
String[] s = {"国","日本","大陆","英国","法国","意大?,"x","韩国"};
Vector v=new Vector();
v.addElement("Nokia 8850");
v.addElement("Nokia 8250");
v.addElement("Motorola v8088");
v.addElement("Motorola v3850");
v.addElement("Panasonic 8850");
    v.addElement("其它");
   
    JComboBox combo1=new JComboBox(s);
    combo1.addItem("中国");//利用JComboBoxcL提供的addItem()ҎQ加入一个项目到此JComboBox中?br />     combo1.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家玩?"));
    JComboBox combo2=new JComboBox(v);
    combo2.setBorder(BorderFactory.createTitledBorder("你最喜欢哪一U手机呢Q?));  
    contentPane.add(combo1);
    contentPane.add(combo2);
    f.pack();
    f.show();
    f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    });
}
}
7-4-2:利用ComboModel构造JComboBox:
    如同JList一般,在JComboBox中也有一个构造函数是利用某种Model来构造。如下所C?
      JComboBox(COmboBoxModel aModel)
   ComboBoxModel是一个interface,里面定义了两个方法,分别是setSelectedItem()与getSelectedItem().q两个方法目的是让用
户选取某个目后,可正地昄出用h选取的项目。下面是q两个方法的详细定义:
ComboBoxModel interface定义的方法:
   Object    getSelectedItem():q回所选取的项目倹{?br />    Void      setSelectedItem(Object anItem):讄所选取的项目?

与JList不同的是QJComboBox是利用ComboBoxModel,而不是ListModel.不过ComboBoxModel interface是承ListModel interface
,因此若我们要利用ComboBoxModel来构造JComboBox,除了要实作ComboBoxModel的两个方法外Q还必须实作ListModel的所定义??br /> ҎQ这L做法可说相当ȝ?br />    在介lJList时我们曾l提到AbstractListModelq个抽象cR这个抽象类实作了ListModel interface中的addListDataListener
()、removeListDataListener()q两个方法。因此若我们l承AbstractListModel,则可掉实作q两个方法,只需要实?br /> getElementAt()、getSize()、setSelectedItem()与getSelectedItem()q?个方法。这L作法显得比较简单一?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox2{
String[] s= {"国","日本","大陆","英国","法国","意大?,"x","韩国"};
public JComboBox2(){
    JFrame f=new JFrame("JComboBox2");
    Container contentPane=f.getContentPane();
   
    ComboBoxModel mode=new UserDefineComboBoxModel();
    JComboBox combo=new JComboBox(mode);
    combo.setBorder(BorderFactory.createTitledBorder("你最喜欢到哪个国家去?"));
    contentPane.add(combo);
    f.pack();
    f.show();
    f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
    });  
}
public static void main(String[] args){
new JComboBox2();
}

class UserDefineComboBoxModel extends AbstractListModel implements ComboBoxModel{
String item=null;
public Object getElementAt(int index){
   return s[index++];
}
     //׃l承AbstractListModel抽象cR因此我们分别在E序中实作了getElementAt()与getSize()Ҏ?br /> public int getSize(){
    return s.length;
}
     //׃我们实现了ComboBoxModel interface.因此我们必须在程序中实作setSelectedItem()与getSelectedItem()Ҏ.
public void setSelectedItem(Object anItem){
      item=(String)anItem;
     }
     public Object getSelectedItem(){
        return item;
     }
}
}
   当程序要show出JComboBoxӞpȝ会先自动调用getSize()ҎQ看看这个JComboBox长度有多,然后再调用getElementAt()
ҎQ将String Array s中的值填入JComboBox中。当用户选择目Ӟpȝ会调用getSelectedItem()ҎQ返回所选取的项目,q?br /> 利用setSelectedItem()ҎQ将选取目攑֜JComboBox最前端?br />    getElementAt()Ҏ中的“index”参数Q系l会自动?计算Q不q要自己作篏加的操作Q如E序?
    return s[index++];
如同JList一般,java对于JComboBox也提供了另一个类QDefaultComboBoxModel实体cR此cȝ承了AbstractListModel抽象c,?br /> 实作了ComboBoxModel interface.因此你不需要再实作getSize()、getElementAt()、setSelectedItem()与getSelectedItem()Ҏ?br /> 利用DefaultComboBoxModelq个cL们可以很方便地做到动态更改JComboBox的项目倹{当你没有必要自己定义特D的ComboBoxModel
Ӟ使用DefaultComboBoxModel显得非常的方便Q我们来看下面的例子:

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox3{
   String[] s = {"国","日本","大陆","英国","法国","意大?,"x","韩国"};
   public JComboBox3(){
      JFrame f=new JFrame("JComboBox3");
      Container contentPane=f.getContentPane();
     
      ComboBoxModel mode=new AModel();
      JComboBox combo=new JComboBox(mode);
      combo.setBorder(BorderFactory.createTitledBorder("您最喜欢到哪个国家玩呢?"));
      contentPane.add(combo);
      f.pack();
      f.show();
      f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
      });  
   }
   public static void main(String[] args){
      new JComboBox3();
   }
   class AModel extends DefaultComboBoxModel{
   AModel(){
   for (int i=0;i<s.length;i++)
   addElement(s[i]);
   }
   }
}
    1.׃AModell承DefaultComboBoxModel实体c,由AModel可得C个ComboBoxModel实体对象?br />     2.我们使AModell承DefaultComboBoxModel实体c,因此׃需要再实作getElementAt()、getSize()、setSelectedItem()?br />       getSelectedItem()q?个方法,直接所要的目用addElement()Ҏ加入卛_。系l会自动所加入的项目放q一个Vector
      中,q在输出JComboBox时自动调用getSize()与getElementAt()Ҏ?br /> 7-4-3:建立有图像的JComboBox:
    在上一节中我们利用ListCellRenderer interface在JList中加入Icon囑փQ而要在JComboBox中加入图像的Ҏ也是一L?br /> 我们必须实作ListCellRenderer interface所定义的方法getListCellRendererComponent.以下个方法的定义Q?br /> 要先了解ListCellRenderer interface.我们必须p个interface所定义的方法,图像画在JComboBox中的每个目?br /> ListCellRenderer interface里只定义了一个方法,那就是getListCellRendererComponent,不过q个参数有点多,我们把它列出?br /> 看看:
public Component getListCellRendererComponent(JList list,
                                              Object value,
                                              int index,
                                              boolean isSelected,
                                              boolean cellHasFocus)
list:x要画上的囑փ的JComboBoxlg?br /> value:JComboBox目|如JComboBox.getModel().getElementAt(index)所q回的倹{?br /> index:为JComboBox目的烦引|?开始?br /> isSelected与cellHasFocus:判断JComboBox中的目是否有被选取或是有焦点置入?br /> 上面q?个参C在你讄JComboBox的绘图样?setCellRenderer())时自动的由JComboBoxlg提供Q你只要兛_怎么控制
getListCellRendererComponent()Ҏ中的4个参敎ͼ而无需担心怎么参数传入?br />    要在JList中加入Icon囑փ的技巧就是将JComboBox中的每一个项目当作是JLabel,因ؓJLabel在用文字与囑փ上非常的方便Q要讄JComboBox的图像,
必须使用setRenderer(ListCellRenderer cellRenderer){?我们在JList中画上图像是利用JList所提供的setCellRenderer(ListCellRenderer
cellRenderer)Ҏ,读者请心}q个Ҏ。我们来看下面这个范例,你就能明白了!

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox4{
String[] s={"西瓜","Ҏ","草莓","香蕉","葡萄"};
public JComboBox4(){
JFrame f=new JFrame("JComboBox");
Container contentPane=f.getContentPane();

JComboBox combo=new JComboBox(s);
combo.setBorder(BorderFactory.createTitledBorder("你最喜欢吃哪些水?"));
combo.setRenderer(new ACellRenderer());
combo.setMaximumRowCount(3);

contentPane.add(combo);
      f.pack();
      f.show();
      f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
      });    
}
public static void main(String[] args){
new JComboBox4();
}
}
class ACellRenderer extends JLabel implements ListCellRenderer{
ACellRenderer(){
   setOpaque(true);
}
public Component getListCellRendererComponent(JList list,
                                              Object value,
                                              int index,
                                              boolean isSelected,
                                              boolean cellHasFocus){
    if (value!=null){
      setText(value.toString());
      setIcon(new ImageIcon(".\\icons\\fruit"+(index+1)+".jpg"));
    }
    if (isSelected){
       setBackground(list.getSelectionBackground());
       setForeground(list.getSelectionForeground());
    }else{
       setBackground(list.getBackground());
       setForeground(list.getForeground());
    }                                   
    return this;      
    }                                             
}
    各们读者在q行q个E序时会发现Q即使JComboBox的选项中有图标Q但在选后图标却不会显C在昄列中Q原因是在上面程序中
我们以String Array s建立JComboBox:
      JComboBox combo=new JComboBox(s);
      String Array s里面攄只是水果名称Q而ƈ没有图标。当我们使用setRenderer()Ҏ来JComboBoxӞ只会l制JComboBox?br /> 选项部䆾Q而最后显C在JComboBox上的D是以String Array sZ据。因此JComboBox昄列就只会昄文字而已Q而不会显C出
囑Ş。要解决q个问题Q我们必L变JComboBox所传入的参数内容,也就是将原来的String Array s更改成具有图形的数据V在
此我们是利用JComboBox(Object[] items)来徏立有囑փ的JComboBox,我们所传进ȝObject Array不应该只有文字,而必连图标一
q传入。我们修改上个范例修改如?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox5
{
    String[] s = {"西瓜","Ҏ","草莓","香蕉","葡萄"};
    ImageIcon[] icons = new ImageIcon[5];;
   
    public JComboBox5()
    {
        JFrame f = new JFrame("JComboBox");
        Container contentPane = f.getContentPane();
        ItemObj[] obj = new ItemObj[5];
       
        for(int i=0; i < 5; i++)
        {
            icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
            obj[i] = new ItemObj(s[i],icons[i]);
        }
       
        JComboBox combo = new JComboBox(obj);//利用ItemObj Array obj当作是JComboBox的参C入,构造出JComboBox.
        combo.setBorder(BorderFactory.createTitledBorder("您喜Ƣ吃哪些水果Q?));
        combo.setRenderer(new ACellRenderer());
        combo.setMaximumRowCount(3);
       
        contentPane.add(combo);
        f.pack();
        f.show();
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                    System.exit(0);
            }
        });
    }
   
    public static void main(String args[])
    {
        new JComboBox5();
    }
}

class ItemObj
{
    String name;
    ImageIcon icon;
   
    public ItemObj(String name, ImageIcon icon){
        this.name = name;
        this.icon = icon;
    }
}
   
class ACellRenderer extends JLabel implements ListCellRenderer
{
    ACellRenderer()
    {
        setOpaque(true);
    }
   
    public Component getListCellRendererComponent(JList list,
                                                  Object value,
                                                  int index,
                                                  boolean isSelected,
                                                  boolean cellHasFocus)
    {
        if (value != null)
        {
            setText(((ItemObj)value).name);
            setIcon(((ItemObj)value).icon);
        }

        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        return this;
    }   
}

   你可以发玎ͼW一栏显C有图标昄出来了。当然你也可以利用ComboBoxModel方式来构造出有图标的JComboBox.我们来看下面
的例?

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox6{
String[] s={"西瓜","Ҏ","草莓","香蕉","葡萄"};
ImageIcon[] icons=new ImageIcon[5];
public JComboBox6(){
    JFrame f=new JFrame("JComboBox");
    Container contentPane=f.getContentPane();
        for(int i=0; i < 5; i++)
        {
            icons[i] = new ImageIcon(".\\icons\\fruit"+(i+1)+".jpg");
        }
        ComboBoxModel mode=new AModel();
        JComboBox combo=new JComboBox(mode);
        combo.setBorder(BorderFactory.createTitledBorder("您喜Ƣ吃哪些水果Q?));
        combo.setRenderer(new ACellRenderer());
        combo.setMaximumRowCount(3);
       
        contentPane.add(combo);
        f.pack();
        f.show();
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                    System.exit(0);
            }
        });
}
public static void main(String[] args){
new JComboBox6();
}
/*我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中~写一个承DefaultComboBoxModel?br /> ComboBoxModel.
*/
class AModel extends DefaultComboBoxModel{
AModel(){
   for (int i=0;i<s.length;i++){
      ItemObj obj=new ItemObj(s[i],icons[i]);
      addElement(obj);
   }
}
}
}
class ItemObj
{
    String name;
    ImageIcon icon;
   
    public ItemObj(String name, ImageIcon icon){
        this.name = name;
        this.icon = icon;
    }
}
   
class ACellRenderer extends JLabel implements ListCellRenderer
{
    ACellRenderer()
    {
        setOpaque(true);
    }
   
    public Component getListCellRendererComponent(JList list,
                                                  Object value,
                                                  int index,
                                                  boolean isSelected,
                                                  boolean cellHasFocus)
    {
        if (value != null)
        {
            setText(((ItemObj)value).name);
            setIcon(((ItemObj)value).icon);
        }

        if (isSelected) {
            setBackground(list.getSelectionBackground());
            setForeground(list.getSelectionForeground());
        }
        else {
            setBackground(list.getBackground());
            setForeground(list.getForeground());
        }

        return this;
    }   
}

   我们用JComboBox(ComboBoxModel aModel)来构造图标的JComboBox,因此我们在程序中~写一个承DefaultComboBoxModel?br /> ComboBoxModel.

7-4-4:建立可自行输入的JComboBox:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox7
{
    String[] fontsize = {"12","14","16","18","20","22","24","26","28"};
    String defaultMessage = "请选择或直接输入文字大!";
   
    public JComboBox7()
    {
        JFrame f = new JFrame("JComboBox");
        Container contentPane = f.getContentPane();
       
        JComboBox combo = new JComboBox(fontsize);
        combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大?));
        combo.setEditable(true);//JComboBox设成是可~辑?
        ComboBoxEditor editor = combo.getEditor();//getEditor()Ҏq回ComboBoxEditor对象,如果你查看手册,你就会发
         //现ComboBoxEditor是个接口(interface),因此你可以自行实作这个接口,制作自己惌的ComboBoxEditorlg。但通常
         //我们不需要这么做Q因为默认的ComboBoxEditor是用JTextField,q已l够应付大部䆾的情况了?br />        
        //configureEditor()Ҏ会初始化JComboBox的显C项目。例如例子中一开始就出现:"请选择或直接输入文字大!"q个
        //字符丌Ӏ?br />         combo.configureEditor(editor, defaultMessage);
       
        contentPane.add(combo);
        f.pack();
        f.show();
        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                    System.exit(0);
            }
        });
    }
   
    public static void main(String args[])
    {
        new JComboBox7();
    }
}


7-4-5:JComboBox的事件处?
    JComboBox的事件处理亦可分ZU,一U是取得用户选取的项?另一U是用户在JComboBox上自行输入完毕后按下[Enter]?
q作相对应的工作。对于第一U事件的处理Q我们用ItemListener.对于W二U事件的处理Q我们用ActionListener.
    q个范例用户可以选取所要的字号Q字L变化会呈现在JLabel上,q可让用戯行输入字体的大小。当用户按下[Enter]键后
Q若用户输入的g在选项上时Q此输入g增加至JComboBox中,q将输入字体的大显C在JLabel上?br />
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class JComboBox8 implements ItemListener,ActionListener{
String[] fontsize={"12","14","16","18","20","22","24","26","28"};
String defaultMessage="请选择或直接输入文字大?";
Font font=null;
JComboBox combo=null;
JLabel label=null;

public JComboBox8(){
JFrame f=new JFrame("JComboBox");
Container contentPane=f.getContentPane();
contentPane.setLayout(new GridLayout(2,1));
label=new JLabel("Swing",JLabel.CENTER);
font=new Font("SansSerif",Font.PLAIN,12);
label.setFont(font);

combo=new JComboBox(fontsize);
combo.setBorder(BorderFactory.createTitledBorder("请选择你要的文字大?"));
combo.setEditable(true);
ComboBoxEditor editor=combo.getEditor();
combo.configureEditor(editor,defaultMessage);
combo.addItemListener(this);0
combo.addActionListener(this);

contentPane.add(label);
contentPane.add(combo);
      f.pack();
      f.show();
      f.addWindowListener(new WindowAdapter(){
    public void windowClosing(WindowEvent e){
    System.exit(0);
    }
      });  
}
   public static void main(String[] args){
   new JComboBox8();
   }
   public void actionPerformed(ActionEvent e){
   boolean isaddItem=true;
   int fontsize=0;
   String tmp=(String)combo.getSelectedItem();
   //判断用户所输入的项目是否有重复Q若有重复则不增加到JComboBox中?br />    try{
   fontsize=Integer.parseInt(tmp);
   for(int i=0;i<combo.getItemCount();i++){
   if (combo.getItemAt(i).equals(tmp)){
   isaddItem=false;
   break;
   }
   }
   if (isaddItem){
   combo.insertItemAt(tmp,0);//插入目tmp?索引位置(W一列中).
   }
   font=new Font("SansSerif",Font.PLAIN,fontsize);
   label.setFont(font);  
   }catch(NumberFormatException ne){
   combo.getEditor().setItem("你输入的g是整数|请重新输?");
   }
   }
   public void itemStateChanged(ItemEvent e){//ItemListener界面只有itemStateChanged()一个方法,在此实作它?br />    if (e.getStateChange()==ItemEvent.SELECTED){//当用L选择改变Ӟ则在JLabel上会昄出Swing目前字Ş大小信息.
   int fontsize=0;
   try{
   fontsize=Integer.parseInt((String)e.getItem());
   label.setText("Swing 目前字Ş大小:"+fontsize);  
   }catch(NumberFormatException ne){//若所输入的g是整敎ͼ则不作Q何的操作.
  
   }
   }
   }
}

Jamie 2011-02-17 08:24 发表评论
]]>
վ֩ģ壺 av뾫Ʒ| ĻƵ߹ۿ | СƵ߹ۿ| ݹѾþþ| վѴȫպ| AVһɫ| ˬˬձƵ| þֻƷ10| һһdvd߹ۿƵ| ɫһ߹ۿ| ʮ˽߹ۿƵ| ޾ƷƷ߹ۿ| ɫվapp߹ۿ| ۺϳ91Ʒ| պëƬѿ| ٺٺƵվ߹ۿ| þAV| Avznlu| ߹ۿѲ| 57paoһƵ| ޶ۺϾþ| Ʒ޳AA߹ۿ | һƵ| AVӰԺ߹ۿ| ޹þþþƷС˵ | ŷרһ| ޻ɫ߹ۿ| avһ| Ů18ؼһëƬƵ| ѹva߹ۿ| պۺϾƷ| ۹һ| ˳վ߹ۿ| ޾ƷþþþAƬԾ| ޾Ʒ߹ۿ| պƷһ| ѹվ߹ۿ | žȾþƵ| 9þѹƷػ| eeussӰԺֱ| Ʒһѹۿ|