<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    當柳上原的風吹向天際的時候...

    真正的快樂來源于創造

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      368 Posts :: 1 Stories :: 201 Comments :: 0 Trackbacks
    注:以下是Swing GUI處理的一個小小技巧,對此無興趣者請退散。

    在Swing中有這樣一種狀況:即長時間運行的事件回調,當它運行時,其余的GUI是沒有響應的。如果這會持續較長的一段時間,它可能會讓使用者感到挫折和困惑。下面一段程序就展示了這一現象,其粗體部分的本意是每隔一秒刷新標簽中的文字,但是結果是按鈕事件響應完畢后,標簽上顯示最后一段文字:
    package com.heyang;

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    public class MyFrame extends JFrame{
        
    private static final long serialVersionUID = -5100794608937579830L;
        
        
    private JLabel msgLbl;
        
    private JButton cmdBtn;
        
        
    public MyFrame(){
            setTitle(
    "MyFrame");
            
            msgLbl
    =new JLabel("提示文字");
            cmdBtn
    =new JButton("刷新文本");
            
            
    this.setLayout(new BorderLayout());
            
    this.add(msgLbl,BorderLayout.NORTH);
            
    this.add(cmdBtn,BorderLayout.CENTER);
            
            
    // 設置大小,位置
            setSizeAndCentralizeMe(300200);
            
            
    // 點擊窗口右上角的關閉按鈕關閉窗口,直接退出程序
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            
    // 按鈕事件注冊
            cmdBtn.addActionListener(new ActionListener() {
                
    public void actionPerformed(ActionEvent e) {
                    runCmd();
                }
            });
            
            setVisible(
    true);
        }
        
        
    private void runCmd(){
            msgLbl.setText(
    "溫故而知新,可以為師矣。");
            longTimeProcess(
    10);
            
            msgLbl.setText(
    "由,汝知之乎!知之為知之,不知為不知,是知也。");
            longTimeProcess(
    10);
            
            msgLbl.setText(
    "見賢思齊焉,見不賢而內自省也");
            longTimeProcess(
    10);
            
            msgLbl.setText(
    "士不可以不弘毅,任重而道遠。");
            longTimeProcess(
    10);
            
            msgLbl.setText(
    "歲寒,然后知松柏之后凋也。");
            longTimeProcess(
    10
    );
        }
        
        
    /**
         * 模擬一個長時處理,以100毫秒為單位
         * 
         * 說明:
         * 
    @param mSeconds
         * 創建時間:2011-1-9 下午12:02:28
         
    */
        
    private void longTimeProcess(int mSeconds){
            
    try{
                Thread.sleep(mSeconds
    *100);
            }
            
    catch(Exception e){
                
            }
        }
        
        
    private void setSizeAndCentralizeMe(int width, int height) {
            Dimension screenSize 
    = Toolkit.getDefaultToolkit().getScreenSize();
            
    this.setSize(width, height);
            
    this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
                    
    / 2 - height / 2);
        }
        
        
    public static void main(String[] args){
            
    new MyFrame();
        }
    }

    要達到預期的效果,Swing建議:讓長時間運行的任務在獨立的線程中運行會好很多,這樣能夠讓GUI有適當響應。修改后的代碼如下:
    package com.heyang;

    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;

    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;

    public class MyFrame extends JFrame{
        
    private static final long serialVersionUID = -5100794608937579830L;
        
        
    private JLabel msgLbl;
        
    private JButton cmdBtn;
        
        
    public MyFrame(){
            setTitle(
    "MyFrame");
            
            msgLbl
    =new JLabel("提示文字");
            cmdBtn
    =new JButton("刷新文本");
            
            
    this.setLayout(new BorderLayout());
            
    this.add(msgLbl,BorderLayout.NORTH);
            
    this.add(cmdBtn,BorderLayout.CENTER);
            
            
    // 設置大小,位置
            setSizeAndCentralizeMe(300200);
            
            
    // 點擊窗口右上角的關閉按鈕關閉窗口,直接退出程序
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            
            
    // 按鈕事件注冊
            cmdBtn.addActionListener(new ActionListener() {
                
    public void actionPerformed(ActionEvent e) {
                    runCmd();
                }
            });
            
            setVisible(
    true);
        }
        
        
    private void runCmd(){
            new Thread(){
                
    public void
     run(){
                    msgLbl.setText(
    "溫故而知新,可以為師矣。");
                    longTimeProcess(
    10);
                    
                    msgLbl.setText(
    "由,汝知之乎!知之為知之,不知為不知,是知也。");
                    longTimeProcess(
    10);
                    
                    msgLbl.setText(
    "見賢思齊焉,見不賢而內自省也");
                    longTimeProcess(
    10);
                    
                    msgLbl.setText(
    "士不可以不弘毅,任重而道遠。");
                    longTimeProcess(
    10);
                    
                    msgLbl.setText(
    "歲寒,然后知松柏之后凋也。");
                    longTimeProcess(
    10);
                }
            }.start();

        }
        
        
    /**
         * 模擬一個長時處理,以100毫秒為單位
         * 
         * 說明:
         * 
    @param mSeconds
         * 創建時間:2011-1-9 下午12:02:28
         
    */
        
    private void longTimeProcess(int mSeconds){
            
    try{
                Thread.sleep(mSeconds
    *100);
            }
            
    catch(Exception e){
                
            }
        }
        
        
    private void setSizeAndCentralizeMe(int width, int height) {
            Dimension screenSize 
    = Toolkit.getDefaultToolkit().getScreenSize();
            
    this.setSize(width, height);
            
    this.setLocation(screenSize.width / 2 - width / 2, screenSize.height
                    
    / 2 - height / 2);
        }
        
        
    public static void main(String[] args){
            
    new MyFrame();
        }
    }

    以上代碼達到了預期效果,其中起關鍵作用的代碼就是以上粗體部分,它將長時處理放到了另一個線程中運行。
    這種做法不是唯一解決之道,Sun提供的SwingWorker類可以幫你達到目的,只是要繁瑣一些。這樣的技巧在耗時檢查,與服務器交互和復雜圖形處理中都能有所應用。

    參考書籍:
    O'REILLY 《Java 線程》一書。

    最后感謝您看到這里。

    何楊,2011年1月9日14:20:37


    posted on 2011-01-09 14:08 何楊 閱讀(1049) 評論(3)  編輯  收藏

    Feedback

    # re: Swing中長時間運行的事件回調里進行界面刷新的特殊處理 2011-12-02 15:32 iridiumcao
    runCmd 方法中的線程更新了GUI組件,不是妥否?

    這幾天我也被同樣的問題困擾。  回復  更多評論
      

    # re: Swing中長時間運行的事件回調里進行界面刷新的特殊處理 2011-12-09 15:47 何楊
    @iridiumcao

    界面沒出問題就行。  回復  更多評論
      

    # re: Swing中長時間運行的事件回調里進行界面刷新的特殊處理 2012-01-02 20:13 iridiumcao
    @何楊
    O(∩_∩)O謝謝  回復  更多評論
      


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 全部免费国产潢色一级 | a级毛片高清免费视频| 一级特黄录像免费播放肥| 亚洲视频在线观看免费视频| 又粗又硬又黄又爽的免费视频| 亚洲国产精品va在线播放| 亚洲第一第二第三第四第五第六 | 亚洲综合一区二区三区四区五区| 一级毛片一级毛片免费毛片| 国产高清不卡免费在线| 红杏亚洲影院一区二区三区| 亚洲欧洲日韩极速播放| 99爱视频99爱在线观看免费| ZZIJZZIJ亚洲日本少妇JIZJIZ| 亚洲国产精品无码中文lv| 大学生一级特黄的免费大片视频| 亚洲AV人无码激艳猛片| jizz免费在线观看| 日韩一区二区三区免费体验| 亚洲影视一区二区| 伊人免费在线观看| 亚洲视频欧洲视频| 久久免费视频99| 亚洲精品无码专区在线在线播放| 亚洲aⅴ无码专区在线观看春色| 全免费毛片在线播放| 亚洲一区综合在线播放| a级毛片100部免费观看| 亚洲精品视频观看| 久久国产免费观看精品3| 亚洲国产精品高清久久久| 99在线精品免费视频九九视| 自拍偷自拍亚洲精品偷一| 成年私人影院免费视频网站| 亚洲精品国产日韩| 亚洲午夜久久久久久噜噜噜| AAAAA级少妇高潮大片免费看| 亚洲国产日韩女人aaaaaa毛片在线| 99热精品在线免费观看| 亚洲成a∨人片在无码2023| 国产亚洲?V无码?V男人的天堂 |