因此,当我运行此代码以尝试更改背景时,GUI崩溃并陷入无限循环,忽略事件侦听器。这是代码:
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 :(得分:0)
通过在循环中调用sleep
,您可以有效地阻止UI线程。在那个循环中,你也在每次迭代时都添加了两个监听器,这非常奇怪。
不要阻止UI线程。让GUI框架负责提供事件等。基本上你需要采用基于事件的方法来实现UI,而不是你当前 采取的方法,这将永远不会让任何事件被发送(如你永远不会把控制权交还给来电者。)
创建面板,添加适当的事件侦听器,然后将其返回给调用者。如果你想每4秒更改一次背景颜色,你应该这样做via a timer,这样它就不会阻止等待4秒钟的UI线程。