3

私は個人的な使用のために小さなスイングアプリケーションを作成しました。このアプリはインターネットに接続し、テキスト ファイルを取得し、その内容を jTextArea に表示し、テキスト ファイルをローカル (私の hardisk) に保存します。ここまでは順調ですね。

ここで、このテキスト ファイルを一定の間隔 (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);
    }
}
4

1 に答える 1

2

Actually, you don't need to use Futures in order to get results. Do the following:

  • make GetScore as Runnable
  • pass TextArea to the constructor of GetScore
  • when GetScore.run method will be executed, wither use textArea.setText method, or use SwingUtilities.invokeLater

like:

 SwingUtilities.invokeLater(new Runnable() {
     public void run() {
        textArea.setText(text);
     }
 );
于 2012-09-23T19:34:37.363 に答える