ループは、イベントリスナーを無視しながら、
-
13-09-2019 - |
質問
私はこのコードを実行するときに、背景に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;
}
の代わりに、それだけでパネルを表示し、他には何もしませんし、私は終了することを強制する必要があり、背景を変更するプログラムやイベントを終了するループを終了します。私は何をすべきでしょうか?
解決
あなたは効果的にループでsleep
を呼び出すことによって、UIスレッドをブロックしています。そのループでは、あなたはまた、非常に奇妙である、あまりにも反復ごとに2人のリスナーを追加しています。
UIスレッドをブロックしないでください。 GUIフレームワークは、基本的に、あなたは現在、<全角>というアプローチよりも、UIにイベントベースのアプローチを取る必要があるなどのイベントを提供するの面倒を見てみましょうされているすべてのイベントが発送ましょうことは決してありませんの撮影、(などあなたは)、呼び出し元に制御を戻すことはありませんしています。
、パネルを作成し、適切なイベントリスナを追加し、ちょうど、呼び出し元に戻します。あなたは背景色ごとに4秒を変更したい場合は、を経由していることを行う必要がありますそれが経過する4秒間待ってUIスレッドをブロックしていないようにタイマーでます。
所属していません StackOverflow