2

他のクライアントからテキスト ファイル (.txt) を受信し、Java Netbeans GUI のテキスト領域に (TextRecv.append を使用して) 追加する Java GUI を作成しましたが、他のクライアントから既に送信されたファイルを読み取れません。 readfile メソッドをボタンに配置して実行しますが、ボタンを押したときにのみ読み取りますが、それは私が望む結果ではありません。私の目標は、この GUI を動的に受け取り、読み取り、テキスト領域に自動的に追加することです。

私の状況では、2 台のマシンがあり、Java で dtncpd を実行してファイルを送信します。これは、2 台のマシンでファイルを送信する方法ですが、両方の 2 台のマシンで、テキスト ファイルは既に宛先に表示されていますが、テキストエリアには追加されません。

そうやって送っています

 private void DTNSendActionPerformed(java.awt.event.ActionEvent evt) {                                        
    // TODO add your handling code here:
    String text = "";
    String name = usernameField.getText();
    text = name.toString()+ ":"+ TextInput.getText().toString();

    try{
        FileWriter fstream = new FileWriter("msg.txt");
        BufferedWriter out = new BufferedWriter(fstream);
        out.write(text);
        out.close();
    }catch(IOException e)
    {
        e.printStackTrace();
    }
    TextInput.setText("");


    try{ //Show what sender type
        BufferedReader ins = new BufferedReader(new FileReader("msg.txt"));
        String Stream;
        while((Stream = ins.readLine())!=null)
        {
            TextRecv.append(Stream+"\n");
        }
    }catch(IOException e){ e.printStackTrace();}

    String sendcmd = "dtncp NetBeansProjects/DTNChat/msg.txt dtn://abc.dtn";
    Runtime runtime1 = Runtime.getRuntime();
    try{
        Process process1 =runtime1.exec(sendcmd);
    }catch(IOException e)
    {
        e.printStackTrace();
    }

問題は、ボタンを使用せずに、テキストエリアを受信して​​自動的に追加するファイルを Java Gui がどのように読み取ることができるかです。

なにか提案を??毎度アドバイスありがとうございます

編集済み 私はこのようにコーディングしていますが、TextAreaに追加されていません

 SwingWorker worker = new SwingWorker<Void,String>(){
    protected Void doInBackground(){
        File file = new File("/home/XXX/Desktop/incoming/ABC.dtn/msg.txt");
        boolean exists = file.exists();
        while(exists)
        {
            try{
                FileReader read = new FileReader("/home/XXX/Desktop/incoming/ABC.dtn/msg.txt");
                BufferedReader in = new BufferedReader(read);
                String show;
                while((show=in.readLine())!=null)
                {
                    TextRecv.append(show);
                }
            }catch(IOException e){}
        }
        return null;
    }
};

    public void actionPerformed(ActionEvent ae){
        worker.execute();
    }
4

1 に答える 1

3

1. 2 台のマシンが関係している場合は、両側で送受信する必要があると想定しています。

2.したがって、GUI スレッドである EDT (イベント ディスパッチャー スレッド) から実行される別のスレッドを保持する必要があります。

3.このスレッドで、ファイルをドロップする特定のフォルダー内のファイルの数をチェックし続け、Count 変数を保持してカウントを保持することができます。ファイル名をArrayListに格納します

4.新しいファイルが到着すると、Count が 1 ずつ増加し、この新しく到着したファイル名を持つファイルが既に ArrayList にあるかどうかを確認します。そうでない場合は、このファイルの内容を JTextArea に追加します。

5.上記を実行する別のスレッドを保持します。EDT ではありません。そうしないと、GUI が応答しなくなります。

//////////////////////////////// 編集: /////////////// /////////////////////

6. Swing のmain()メソッドはNot Long Livedです。イベント ディスパッチャ スレッドで GUI の構築をスケジュールし、終了します。現在、GUI を処理するのは EDT の役割です。

7. main () メソッドは、EventQueue.invokeLater を使用して、JFrame を可視化する作業のみを行う必要があります。

例えば:

    public static void main(String[] args){

       EventQueue.invokeLater(new Runnable(){

       public void run(){

       myFrame.setVisible(true);
     }
  }
}

8.SwingWorker は Java によって提供され、GUI スレッドで非 UI スレッドの作業出力を同期します。

/////////////////////編集済み/////////////////////////

9. Thread クラスに拡張するか、Runnable を実装することで、スレッドを作成できます。ここでは Runnable の例を示しています。

これら 2 つのクラスを同じファイルに入れます。

Runnable を実装するクラス

class MyTest implements Runnable{

public void run(){

   go();
}

public void go(){

  for (int i=0 ; i<10 ; i++){

           System.out.println("Hello i am work nos "+i);
    }

 }
}

main() メソッドを含むクラス

public class TestMain{

  public static void main(String[] args){

          Thread t = new Thread(new MyTest());
          t.start();
   }
}

10. Runnable を実装する Anonymous Inner クラスを使用することもできます。

AnonymousInner クラスと main() メソッドを持つクラス

    public class TestMain{

    public void go(){

           for(int i=0 ; i<10 ; i++){

             System.out.println("Hello i am work nos "+i);
           }

   }

      public static void main(String[] args){

              Thread t = new Thread(new Runnable(){

              public void run(){

                new TestMain().go();

           }

   });
              t.start();
       }
    }
于 2012-07-20T04:53:54.277 に答える