我有一個JRuby腳本,它打開一個Java對話框來報告腳本的進度。Java Swing對話框,如何在捕獲WindowClosing事件時調用wait方法
我正在捕獲一個windowclosing事件,並希望對話框等到JRuby腳本中發生了一些清理,然後進行處理。相反,當用戶按下右上方的紅色x按鈕時,對話框會掛起。
如何正確調用wait方法來等待該標誌更改?我正確使用鎖定對象嗎?
jruby腳本調用此對話框。
如果用戶按下右上角的紅色X,對話框將捕獲windowclosing事件並設置'取消'標誌。 腳本會留意那個標誌,然後開始關閉一些長時間運行的任務,而不是什麼。完成後,它會更新對話框上的標記以表示已進行清理。 同時,對話框正在循環,等待該標誌發生變化。然後它調用dispose()。
我試過使用睡眠。出於某種原因,這會擾亂我的JRuby和對話框之間的某些東西,清理會發生,但對話框不會處理。
使用wait,with synchronize(this)會生成一個IllegalMonitorException,但是腳本將清除並且對話框會正確地處理除了異常之外的東西。
看了一堆關於如何合併等待方法的其他帖子,非常想了解這一點。
非常感謝您的幫助。
對話框類,如下所示:
import javax.swing.*;
import java.awt.*;
public class MyDialog extends JDialog {
private boolean userCancelled;
private boolean scriptCleanedUp;
//private static Object lock = new Object();
public MyDialog(lock) {
userCancelled = false;
scriptCleanedUp = false;
setDefaultCloseOperation(2);
//[..] add various controls to dialog
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
// the jruby script keeps an eye on this flag to see if the user has cancelled the dialog
userCancelled = true;
/* once cancelled, wait for script to flag that it has performed its cleanup
*/
/* here is the problem area, what do I need to synchronize to use the wait method?
*/
while (!scriptCleanedUp) {
try {
synchronized (lock) {
lock.wait(1000000000);
}
// Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
dispose();
}
});
super.paint(super.getGraphics());
}
public boolean user_cancelled() { return userCancelled; }
public void setScriptCleanedUpToTrue() { this.scriptCleanedUp = true; }
public static void forBlock(MyDialogBlockInterface block)
{
MyDialog dialog = new MyDialog(new Object());
dialog.setVisible(true);
block.DoWork(dialog);
dialog.dispose();
}
}
如果有幫助,這是JRuby的腳本是如何調用該對話框
MyDialog.forBlock do |dialog|
#do long running jruby task here
end
是否JRuby的呼叫碼也顯示某種類型的擺動窗口的諸如一個JFrame? –
不,它沒有。不知道這是否有幫助,但還有其他一些Swing的東西正在發生 - JRuby代碼由Java應用程序運行,並且該應用程序使用Swing作爲接口。因此該應用程序正在運行JRuby代碼,然後調用我的小對話框。 –