2012-09-23 21 views
3

我爲我的個人使用製作了一個小型鞦韆應用程序。這個應用程序連接到互聯網,檢索一個文本文件,在jTextArea中顯示其內容並將文本文件保存在本地(在我的硬盤中)。到現在爲止還挺好。如何以固定間隔從線程獲取字符串值,同時能夠暫停/恢復?

現在我想以固定的時間間隔接收這個文本文件(比如每隔30秒之後)。我可以通過for/while循環(和thread.sleep方法)來做到這一點,但我知道這是不正確的,因爲它不允許我暫停/恢復接收。我嘗試過使用「線程」和「可調用」來解決我的問題,但無法成功。 (我對這些知識還沒有太多瞭解)

你能指導我如何從線程中收集字符串值嗎?我是否在使用Callable/Future做正確的事情? (請參閱我的代碼)。我應該可以暫停/恢復文本收藏。

(在暫停和恢復我的軟件,我將一些手工文本編輯並保存到磁盤上。但是我可以搞定。)

下面是我的代碼,我試過了。

public class AmybactUI extends javax.swing.JFrame { 

    public AmybactUI() { 
     initComponents(); 
    } 
    private void initComponents() { .... } 

    public static void main(String args[]) throws Exception { 

    // (Look and feel setting code here) 

     java.awt.EventQueue.invokeLater(new Runnable() { 

      public void run() { 
       new AmybactUI().setVisible(true); 
      } 
     }); 

     ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
     List<Future<String>> results = executor.invokeAll(Arrays.asList(new GetScore()), 30, TimeUnit.SECONDS); 
     for (Future<String> result : results) { 
      if (!result.isCancelled()) { 
        jTextAreaOnlineScore.append(result.get()+"\n"); 
        jTextAreaOnlineScore.setCaretPosition(jTextAreaOnlineScore.getDocument().getLength()); 
       } else { 
        System.out.println("Task timed out."); 
       } 
       executor.shutdown(); 
      }    
    } 

    // Variables declaration - do not modify      
    private javax.swing.ButtonGroup buttonGroup1; 
    private javax.swing.JButton jButtonSaveSMS; 
    private javax.swing.JLabel jLabelTitle; 
    private javax.swing.JMenuBar jMenuBar; 
    private javax.swing.JMenu jMenuFile; 
    private javax.swing.JMenu jMenuHelp; 
    private javax.swing.JMenuItem jMenuItemAbout; 
    private javax.swing.JMenuItem jMenuItemExit; 
    private javax.swing.JMenuItem jMenuItemOptions; 
    private javax.swing.JMenu jMenuTools; 
    private javax.swing.JPanel jPanel; 
    private static javax.swing.JRadioButton jRadioButtonOffline; 
    public static javax.swing.JRadioButton jRadioButtonOnline; 
    private javax.swing.JScrollPane jScrollPane; 
    public static javax.swing.JTextArea jTextAreaOnlineScore; 
    private javax.swing.JTextField jTextFieldCustomSMS; 
    // End of variables declaration     
} 

class GetScore implements Callable<String> { 
    public String call() throws Exception {   
     Calendar cal = Calendar.getInstance(); 
     SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); 
     String nextLine; 
     String myString = ""; 
     String myTryString; 
     URL url; 
     URLConnection urlConn; 
     InputStreamReader inStream; 
     BufferedReader buff; 
     FileWriter fustream; 
     BufferedWriter bfout; 
     try { 
//   (some code here which connects to internet and gets my text) 
      } else { 
       break; 
      } 
     } 
      bfout.write(myString); 
      bfout.close();   
     } catch(MalformedURLException e) { 
      System.out.println("Please check the URL:" + e.toString()); 
     } catch(IOException e1) { 
      System.out.println("Can't read from the Internet: " + e1.toString()); 
     } 
     Thread.sleep(4000); 
     return (""+sdf.format(cal.getTime())+myString); 
    } 
} 
+0

是否正在該代碼或者是你得到了一些錯誤? – Tudor

+0

你應該提供你的工作的[sscce](http://sscce.org),而不是整個代碼。 –

+0

Tudor:代碼正在工作,但是當我嘗試暫停該線程時,我的應用程序掛起。 – mzeeshan

回答

2

其實,您不需要使用期貨來獲得結果。執行以下操作:

  • 使GetScore爲Runnable的
  • 通文本區域,以GetScore
  • 時GetScore.run方法將被執行,枯萎使用textArea.setText方法,或者使用SwingUtilities.invokeLater
的構造

喜歡:

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     textArea.setText(text); 
    } 
); 
+0

jdevelop:好的。我會在你建議的時候編寫代碼,稍後再回來。謝謝 – mzeeshan

+0

我在我的主類工作中得到了這個新代碼: public static void main(String args[]) { javax.swing.SwingUtilities.invokeLater(new Runnable() { public void run() { new NewJFrame().setVisible(true); jTextArea1.append(myMethod()); } private String myMethod() { return "Some text\n"; } }); } 但是如何使連續的jTextArea1.append循環?按固定間隔?正如我之前所說,如何暫停和恢復這個循環?請幫忙。 – mzeeshan

+0

完成。我現在全部工作了。謝謝。關鍵是SwingUtilities.invokeLater。如果有人喜歡,我可以發佈完整正確的代碼。 – mzeeshan