2009-12-05 146 views
0

因此,當我運行此代碼嘗試更改背景GUI崩潰並陷入無限while循環忽略事件偵聽器。這裏是代碼:while循環忽略事件偵聽器

private Panel getPanel1() { 
     if (panel1 == null) { 
      panel1 = new Panel(); 
      panel1.setLayout(new GridBagLayout()); 
      while(frame.isVisible()){ 
       panel1.addMouseListener(new java.awt.event.MouseAdapter() { 
        public void mouseClicked(java.awt.event.MouseEvent e) { 
         frame.setVisible(false); 
        } 
       }); 
       int r = (int) (Math.random()*255); 
       int g = (int) (Math.random()*255); 
       int b = (int) (Math.random()*255); 
       Color c = new Color(r, g, b); 
       panel1.setBackground(c); 
       try { 
        Thread.sleep(4000); 
       } catch (InterruptedException e1) { 
        e1.printStackTrace(); 
       } 
       panel1.addMouseListener(new java.awt.event.MouseAdapter() { 
        public void mouseClicked(java.awt.event.MouseEvent e) { 
         /*panel1.setVisible(false); 
         frame.setVisible(false);*/ 
         System.exit(0); 
        } 
       }); 
      } 
     } 
     return panel1; 
} 

,而不是退出終止程序或事件改變它只是顯示面板,所以沒有任何其他背景的循環,我必須迫使它退出。我該怎麼辦?

回答

0

通過在循環中調用sleep可以有效地阻止UI線程。在那個循環中,你也會在每次迭代中增加兩個監聽器,這非常奇怪。

不要阻塞UI線程。讓GUI框架負責提供事件等。基本上,您需要採用基於事件的UI方法,而不是您現在使用的的方法,這將永遠不會讓任何事件發送(因爲您永遠不會返回控制呼叫者)。

創建面板,添加適當的事件偵聽器,然後將其返回給調用者。如果您想每4秒更改一次背景顏色,則應該這樣做via a timer,以便它不會阻止UI線程等待4秒鐘。