2012-12-12 53 views
2

這裏的文件選擇對話框是我的文件選擇對話框的操作代碼...不關閉

FileChooser fc = new FileChooser(); 
fc.setTitle("Pointel File"); 
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage()); 

int i =0; 
while(i < 90000){ 
System.out.println(i); 
i++; 
} 

在上面的代碼中,對話框等到「而」循環結束執行,而不是關閉自身的時刻我們點擊'打開'按鈕。

我在代碼中遺漏了什麼,當我們點擊'打開'或'取消'按鈕時,它將關閉對話框?
任何人都可以請幫我嗎?

+0

+1很有趣遇到這種情況.. :)開玩笑吧。我想,他們是在同一個線程運行,這就是爲什麼這個問題。 – Amarnath

+0

@Che謝謝你的快速回復。我在另一個線程中嘗試過,但問題是,從其他線程調用時,其中一個其他UI組件不會正確更新。所以我不得不把它放在同一個線程中。在同一個線程中做任何其他工作。 – Freakyuser

+0

@David Kroukamp您能否指定您正在討論的線程所在的類和包是否存在?或者如果這個'javafx.concurrent.Task'就是你所說的;如果可以,請讓我知道這是屬於哪個jar文件? – Freakyuser

回答

2

您正在UI的Application Thread上長時間運行,不應該這樣做,否則UI將無響應。

寧可創建一個TaskThread以在應用程序線程上執行長時間運行進程。

this鏈接,更多的併發用JavaFX

這裏是Task一個簡單的例子:

import javafx.concurrent.Task; 

.... 

FileChooser fc = new FileChooser(); 
fc.setTitle("Pointel File"); 
File file1 = fc.showOpenDialog(MainFrame.objComponent.getPrimaryStage()); 

    final Task task = new Task<Void>() { 
     @Override 
     protected Void call() throws Exception { 
      int i = 0; 
      while (i < 90000) { 
       System.out.println(i); 
       i++; 
      } 
      return null; 
     } 
    }; 
    Thread th = new Thread(task); 
    th.setDaemon(true); 
    th.start(); 

還要記住,如果你修改任何JavaFX的UI組件包裹代碼Platform.runLater(Runnable r)塊這樣的:

import javafx.concurrent.Task; 

.... 

final Task task = new Task<Void>() { 
    @Override 
    protected Void call() throws Exception { 
     int i = 0; 
     while (i < 90000) { 
      System.out.println(i); 
      i++; 
     } 
    Platform.runLater(new Runnable() {//updates ui on application thread 
      @Override 
      public void run() { 
       //put any updates to ui here dont run the long running code in this block or the same will happen as doing a long running task on app thread 
      } 
     }); 
     return null; 
    } 
}; 
Thread th = new Thread(task); 
th.setDaemon(true); 
th.start(); 
+0

@Freakyuser請參閱我的更新回答 –

+0

感謝您的回答。我已經嘗試過,但編譯器說沒有這樣的方法。線程方法不接受'任務'參數。 – Freakyuser

+0

@Freakyuser你確定你有線程的正確導入嗎?它不應該是java而是javafx –

0

不要在相同的線程上做GUI和計算任務。你的用戶界面應該在一個線程上運行,你的計算任務應該在其他線程上運行。如果UI在同一線程上運行,UI將變得無響應。

首先了解,

Threads

The Event Dispatch Thread

SwingWorker

使用Event Dispatch Thread,您可以發送您的UI線程。請看@Erick Robertson給出的與EDT相關的answer

關於上述主題,許多SO的文章都有提供。