雲龍 發問時間: 電腦與網際網路程式設計 · 1 0 年前

Java按鈕問題

我用 Java 設計了一個 AP,主要是將網頁資料解析下來之後,存入資料庫中。設計上是有一個按鈕設定按下後便開始解析資料且將資料丟入資料庫,是解析在線xml網頁資料,有600筆。然後有一個按鈕是設定成停止解析,另外第三個按鈕是關閉程式。問題來了,當我按下第一個按鈕開始解析之後,按鈕就變成下陷的狀態((也就是維持按下去的狀態)),資料有持續解析中,但是這時候我沒辦法按其他兩個按鈕,不能停止也不能關閉程式,請問有什麼辦法可以解決。我試過用 Actionperformed 跟 Actiolistener 都是一樣的結果... 有沒有高手可以幫我解答?

我有試過只解析5筆資料的,按鈕會再按下後便跳回((因為五筆資料很快就解析完了)),如果是完整的,都要等到600筆資料都解完我才能控制其它按鈕,這是哪邊有問題呢?

我想設計成像安裝一套軟體一樣,隨時可以按中斷或取消甚至暫停,這樣要怎麼做呢?

已更新項目:

ωετμοφντ

我稍微看了一下你說的Thread方法,好像不太能解決我的問題,不知道是不是我沒有看懂。

用個例子好了,如果說我設定一個執行按鈕,按下後執行一段程式如下

do{

System.out.println("請按停止按鈕");

}while(stop != true);

那我要怎麼設計另一個停止按鈕讓 stop 變成 true然後停止執行迴圈?

語法我會,重點是在,當我按下執行按鈕之後,程式就一直執行迴圈程式,Frame視窗上所有按鈕都不能按了... 要如何讓迴圈程式在執行時,停止按鈕依然隨時可以按,然後把 stop設定成 true讓迴圈停止。

2 個已更新項目:

嗯,終於試成功了~ 可以中斷掉了

原來要對想中斷的執行緒設定 .interrupt,而不是 .interrupted。後者的意思看起來比較像"被中斷",害我搞混了。

3 個已更新項目:

還有最後一個問題請教,我剛剛試了中斷之後,再按一次執行的按鈕,跑出了一堆 error,也就是說,中斷後就不能繼續執行了。而我再裡面有看到一個 .wait()的方法,這一個是用來做暫停的嗎? 因為 .sleep() 好像只是暫停一段時間之後就自動繼續執行,可以變成一樣用按鈕控制暫停跟繼續嗎? 是用剛剛我說的那個 .wait()方法嗎? 我有試著把你給的範例中的 t1.interrupt(); 改成 t1.wait(); ,但是沒有作用。而且說我說法錯誤。

2 個解答

評分
  • 1 0 年前
    最佳解答

    建議你用MultiThread來實作,也就是一個Thread負責按鈕,另一個Thread負責解析,如果解析到一半要中斷時,負責按鈕的Thread才不會卡住,而能夠去中斷解析的那一個Thread。這裡提供你一個中斷Thread的實例,至於Thread的基本實作,相信你在網上應該可以輕易地找到吧。

    參考資料

    藍森林論壇

    2009-06-18 13:33:16 補充:

    根據你的例子,我寫了以下的範例。其中一個Thread是執行printlin(),而另一個Thread則是用來中斷它的。

    public class Y4918 {

    public static void main(String[] args) {

    final Thread t1 = new Thread() {

    public void run() {

    do{

    System.out.println("請按停止按鈕");

    } while(!isInterrupted());

    }

    };

    2009-06-18 13:33:22 補充:

    final Thread t2 = new Thread() {

    public void run() {

    try {

    sleep(1000);

    } catch (Exception e) {

    }

    t1.interrupt();

    }

    };

    t1.start();

    t2.start();

    }

    }

    2009-06-18 18:30:36 補充:

    sleep() 是會先睡一段時間, 再繼續執行之後的程序碼;wait()則是一直睡, 直到有其他的執行緒用 notify() 或 notifyAll() 才會醒來繼續之後的程序碼。這個範例你可以參考"實現wait()和notify()的調度功能"

    http://www.99inf.net/SoftwareDev/Java/48719.htm

  • CK
    Lv 4
    1 0 年前

    wait() 是用於 同步 (synchronization), 當資源或物件被佔用時所進入的狀態, 當佔用者 (another thread) 釋放時需執行 yield() 而讓系統通知其他 threads 可以繼續執行該資源或物件

還有問題?馬上發問,尋求解答。