Swing while循环忽略事件侦听器
因此,当我运行此代码试图更改背景时,GUI崩溃并陷入无限while循环,忽略事件侦听器。代码如下:Swing while循环忽略事件侦听器,swing,awt,infinite-loop,Swing,Awt,Infinite Loop,因此,当我运行此代码试图更改背景时,GUI崩溃并陷入无限while循环,忽略事件侦听器。代码如下: private Panel getPanel1() { if (panel1 == null) { panel1 = new Panel(); panel1.setLayout(new GridBagLayout()); while(frame.isVisible()){ pan
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;
}
它没有退出终止程序或事件改变背景的循环,而是只显示面板,不做其他事情,我必须强制它退出。我该怎么办?通过在循环中调用sleep,您有效地阻止了UI线程。在这个循环中,每次迭代也会添加两个侦听器,这很奇怪 不要阻塞UI线程。让GUI框架负责传递事件等。基本上,您需要对UI采取基于事件的方法,而不是您当前正在采取的方法,因为您永远不会将控制权返回给调用方,因此不会让任何事件发送 创建面板,添加适当的事件侦听器,然后将其返回给调用者。如果您想每4秒钟更改一次背景颜色,那么应该这样做,这样它就不会阻塞等待4秒钟过去的UI线程