2009-12-05 119 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秒钟。