程序中用Swing组件时应注意,任何java程序都是由主线程中的main()方法开始执行,当main()方法中的JFrame调用setVisiable(true) 后,引发了另一个线程——事件分派线程,而actionPerformed()方法及paintComponent()方法都是在事件分派Swing线程中被调用,所以如果在actionPerformed()方法中有大量的耗时操作,将会导致用户界面无法响应用户请求,造成用户界面锁死。在这种情况下,最好在 actionPerformed()方法中将耗时操作的程序部分移至一个新的Swing线程中实现,这样程序在进行大量计算的同时又可以及时地响应用户请求。

创新互联专业为企业提供渝北网站建设、渝北做网站、渝北网站设计、渝北网站制作等企业网站建设、网页设计与制作、渝北企业网站模板建站服务,十载渝北做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。
- packagetestswingguilock;
 - importjavax.swing.*;
 - importjava.awt.*;
 - importjava.awt.event.*;
 - publicclassTestSwingGUILock{
 - TestSwingGUILock(){
 - initGUI();
 - }
 - voidcostMoreTime(){
 - doubled=0;
 - //耗费大量时间的操作
 - for(inti=0;i
 ;i++) - d+=i;
 - System.out.println("Ihavedosomanyworks!Theresultis"+d);
 - }
 - voidinitGUI(){
 - JButtonjbutton=newJButton("Start");
 - jbutton.addActionListener(newActionListener(){
 - publicvoidactionPerformed(ActionEvente){
 - System.out.println("Youhavepressedme!");
 - //将耗时操作放置在新的线程内完成
 - newThread(newRunnable(){
 - publicvoidrun(){
 - costMoreTime();
 - }
 - }).start();
 - }
 - });
 - JFramejframe=newJFrame();
 - Containercontainer=newContainer();
 - container.setLayout(newBorderLayout());
 - container.add(jbutton,BorderLayout.SOUTH);
 - jframe.setContentPane(container);
 - jframe.setSize(200,200);
 - jframe.setVisible(true);
 - jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 - }
 - publicstaticvoidmain(String[]args){
 - newTestSwingGUILock();
 - }
 - }
 
【编辑推荐】