在Java GUI中动态更新文本文件

时间:2012-07-20 04:11:12

标签: java

我创建了JAVA GUI,它将从其他客户端接收文本文件(.txt)并附加到Java Netbeans GUI中的textarea(通过使用TextRecv.append)但是它不会读取已经从其他客户端发送的文件客户端,我尝试将readfile方法放在按钮执行中,但是只有当我按下按钮时它才会读取,但这不是我想要的结果,我的目标是让这个GUI动态接收文件,读取并附加到我的文本区域自动

我的情况是我有2台机器,然后我通过执行dtncpd在Java中发送文件,处理如何通过2台机器发送文件但是在两台机器上文本文件已经出现在目的地但是它没有附加在textarea

我的发送方式

 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的文件

任何建议?感谢您的每一条建议

被修改 我编码是这样的,但它不会附加在我的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();
    }

1 个答案:

答案 0 :(得分:3)

1。我假设如果涉及2台机器,那么您必须双方发送和接收。

2。所以你需要保留单独的线程,这将是运行你的EDT(事件调度程序线程),这是你的GUI线程

3。您可以让线程继续检查要删除文件的特​​定文件夹中的文件数,并将计数变量保留为保持计数将文件名存储在ArrayList中

4. 新文件到达时,计数将增加1 ,然后检查是否有任何带有此新文件名的文件是否已经在您的ArrayList中,如果没有将此文件内容附加到您的JTextArea。

5. 保留一个单独的线程来执行上述操作,而不是在EDT上,否则您的GUI将无响应。

///////////////////////////////// 已编辑: ///// ///////////////////////////////

6. :Swing中的main()方法不长期。它在Event Dispactcher Thread中安排GUI的构造,然后退出。 现在由EDT负责处理GUI。

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线程的工作输出。

<强> ///////////////////// EDITED ////////////////////// ////

9。您可以通过扩展到Thread Class或实现Runnable 来创建线程。        我在这里展示了Runnable的例子。

将这两个类放在同一个文件中。

实施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. 您还可以使用Anonymous Inner类来实现Runnable。

具有Anonymouse内部类和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();
       }
    }