2013-03-21 101 views
0

我在使用JFrame時出現問題,它會凍結,而 會不斷運行代碼。下面是我的代碼:JFrame凍結時連續運行代碼

  1. 在點擊btnRun,我調用的函數MainLoop()

    實施MainLoop()
    ActionListener btnRun_Click = new ActionListener() { 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         MainLoop(); 
        } 
    }; 
    
  2. void MainLoop() 
    { 
        Hopper = new CHopper(this); 
        System.out.println(Hopper); 
        btnRun.setEnabled(false); 
        textBox1.setText(""); 
        Hopper.getM_cmd().ComPort = helpers.Global.ComPort; 
        Hopper.getM_cmd().SSPAddress = helpers.Global.SSPAddress; 
        Hopper.getM_cmd().Timeout = 2000; 
        Hopper.getM_cmd().RetryLevel = 3; 
    
    
        System.out.println("In MainLoop: " + Hopper); 
    
        // First connect to the validator 
        if (ConnectToValidator(10, 3)) 
        { 
         btnHalt.setEnabled(true); 
         Running = true; 
    
         textBox1.append("\r\nPoll Loop\r\n" 
           + "*********************************\r\n"); 
        } 
    
        // This loop won't run until the validator is connected 
        while (Running) 
        { 
         // poll the validator 
         if (!Hopper.DoPoll(textBox1)) 
         { 
          // If the poll fails, try to reconnect 
          textBox1.append("Attempting to reconnect...\r\n"); 
          if (!ConnectToValidator(10, 3)) 
          { 
           // If it fails after 5 attempts, exit the loop 
           Running = false; 
          } 
         } 
         // tick the timer 
           // timer1.start(); 
         // update form 
         UpdateUI(); 
         // setup dynamic elements of win form once 
         if (!bFormSetup) 
         { 
          SetupFormLayout(); 
          bFormSetup = true; 
         } 
    
        } 
    
        //close com port 
        Hopper.getM_eSSP().CloseComPort(); 
    
        btnRun.setEnabled(true); 
        btnHalt.setEnabled(false); 
    } 
    
  3. MainLoop()功能,而循環繼續運行,直到運行是真實的問題是,如果我wa NT才能停止while循環我必須設置運行到這是在另一個按鈕btnHalt做虛假:

    ActionListener btnHalt_Click = new ActionListener() { 
    
        @Override 
        public void actionPerformed(ActionEvent e) { 
         textBox1.append("Poll loop stopped\r\n"); 
         System.out.println("Hoper Stopped"); 
         Running = false; 
        } 
    }; 
    

btnHalt沒有響應,整個畫面是得到凍結,也沒有 顯示任何日誌textarea

+2

請學習java命名約定並堅持使用它們。 – kleopatra 2013-03-21 11:09:14

回答

2

Swing是一個單線程框架。也就是說,有一個線程負責將所有事件分派給所有組件,包括重新繪製請求。

任何停止/阻止此線程的操作都將導致您的用戶界面「掛起」。

Swing的第一條規則,從不在Event Dispatching Thread上運行任何阻塞或耗時的任務,而應該使用後臺線程。

這會讓你陷入Swing的第二條規則。切勿創建,修改或與EDT之外的任何UI組件進行交互。

有很多方法可以解決這個問題。您可以使用SwingUtilities.invokeLaterSwingWorker

SwingWorker通常更容易,因爲它提供了許多簡單易用的方法,可以自動將那些調用重新同步到EDT。

取讀通過Concurrency in Swing

更新

只要你瞭解;)

MainLoop方法應該不是EDT的上下文中執行,這是非常糟糕的。

此外,您不應該與來自EDT以外任何線程的任何UI組件進行交互。

+0

我已經創建了MainLoop的單獨線程,但Jframe的作品,但同時點擊btnHalt它不會停止,因爲線程連續運行,你可以給我任何示例代碼 – Jivan 2013-03-21 05:59:38