2013-06-22 78 views
0

我在這裏是新來的,我是Java編程的新手,但是我不得不報名參加這個問題,因爲它讓我困擾了好幾天。 無論如何,我正在寫TCP客戶端。我做了兩個線程:一個用於從System.in讀取併發送到套接字,另一個用於從套接字讀取並寫入System.out。 這工作得很好,但現在我需要做一個GUI,我知道如果我想保持我的GUI交互,我需要使用任務和/或服務,但我不知道如何使我的線程作爲服務。 這裏的代碼(即在終端工作):JavaFX GUI卡住

public static class ReadThread extends Thread 
{ 
    BufferedReader in; 
    String word; 

    ReadThread(BufferedReader in) 
    { 
     this.in = in; 
    } 

    @Override 
    public void run() 
    { 
     try { 
      while((word = in.readLine()) != null) 
       System.out.println(word); 
     } catch (IOException ex) { 
      Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
} 

與此類似,我做了WriteThread,但我不想讓這個帖子凌亂所以...... 無論如何,當我試圖實現這個作爲服務,我不得不在「最終」中產生一些其他錯誤,如此等等。 我會很感激,如果你能幫我在我的特定情況下,因爲我可能讀這個網站上的所有JavaFX的GUI問題haha 在此先感謝和抱歉的長篇文章! :d

回答

1

我這是怎麼實現的服務

public class ReadService extends Service { 

    BufferedReader in; 
    String word; 

    @Override 
    protected Task createTask() { 
     return new Task() { 
      @Override 
      protected Object call() throws Exception { 
       try { 
        while((word = in.readLine()) != null) 
         System.out.println(word); 
       } catch (IOException ex) { 
        Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex); 
       } 
       return null; 
      } 
     }; 
    } 

    public BufferedReader getIn() { 
     return in; 
    } 

    public void setIn(BufferedReader in) { 
     this.in = in; 
    } 
} 

而且,你必須打電話給你的服務。

ReadService readService = new ReadService(); 
     readService.setIn(//HEre your in); 
      readService.restart(); 

您還可以添加一些處理程序時,您的服務啓動,取消,失敗,完成...

readService.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
     @Override 
     public void handle(WorkerStateEvent workerStateEvent) { 
      // Here the finish action 
     } 
    }); 

那它

+0

非常感謝!有用!但現在我必須從textField和textArea中取代並設置System.in和System.out。 我實際上使它從System.in讀取並寫入textArea,但我不知道如何從textField獲取文本。我不想一直使用發送按鈕,而且我也不知道如何將一個事件方法發送到服務類。 任何想法? – Bade

+0

在TextField或TextArea中,您可以在textfield的textProperty()上添加一個eventListener,並在文本更改時調用它。或者你可以只爲textfield.getText() –

+0

但我應該.start()新的writeService任務與文本上的每個新事件改變或我可以以某種方式傳遞一個方法writeService? 對不起,但我覺得很容易混淆變量範圍的原因:( 最讓我困惑的是這兩行: 'while((command = in.readLine())!= null) out.println(naredba) ;'。我無法編寫command = textField.getText();導致它不知道何時獲取文本 對不起,因爲在頸部疼痛,但我需要做到這一點:D – Bade