2012-02-14 77 views
2

我有一個按鈕和cardlayout與Netbeans貴族。 這個按鈕有一個actionlistener註冊到它自己,當它按下它運行一個外部程序process.waitFor();爪哇gui不立即

我想要的是當你按下按鈕時,gui應該在cardlayout中交換一張卡並運行外部程序。 真的發生什麼是當我按下按鈕的外部程序啓動時,當它finfinished然後gui交換卡。

我需要在GUI上調用uppdate方法嗎?

+0

代碼請,這是你正在使用,將不勝感激。 – 2012-02-14 20:23:48

+0

@GagandeepBali - 說實話,在這種情況下,它是不需要的;他的問題確切地告訴你問題是什麼。 – 2012-02-14 20:26:35

+0

@BrianRoach:正確地指出他/她在正確的方向,將要使用什麼和在哪裏使用,我猜代碼將是一個不錯的選擇。 – 2012-02-14 20:28:29

回答

2

將您的電話到您的外部程序在另一個線程:

Thread t = new Thread(new Runnable() { 
    public void run() { 
    // call to ext. program 
    } 
}); 
t.start(); 
return; 
+0

注意AWT不是線程安全的,因此您應該確保只有一個線程同時運行AWT代碼(除了某些部分是線程安全的,但您必須瞭解它們)。你可以使用'synchronized'或者通過調用'SwintUtilities.invokeLater(Runnable)'強制AWT鏈接到AWT的所有東西。另外,如果你從不同的線程訪問相同的字段,使它變成'volatile'或'synchronized'。 – 2012-02-14 20:51:39

+0

我使用了方法invokeLater,因爲它似乎是正確的路要走。謝謝您的幫助 :) – Jonas 2012-02-14 20:58:43

2

GUI事件由單個線程管理。您通過運行外部程序並等待它完成,從而停止該線程執行其工作(更新顯示)。既然你在事件處理程序中這樣做,那就是執行你的代碼的線程。

你需要有一個單獨的線程管理的是,或使用定時器檢查,看看它是否完成等