淺析Swing中actionPerformed()方法
本文介紹Swing中actionPerformed()方法,如果在actionPerformed()方法中有大量的耗時操作,將會導致用戶界面無法響應用戶請求,造成用戶界面鎖死。
程序中用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<Integer.MAX_VALUE;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();
- }
- }
【編輯推薦】
責任編輯:佚名
來源:
清華大學出版社