2

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

我的情况是我有 2 台机器,然后我通过在 Java 中执行 dtncpd 发送文件,这是我如何通过 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 上

 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.所以你需要保留一个单独的线程,它将在你的 EDT(事件调度程序线程)之外运行,这是你的 GUI 线程

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

4.当一个新文件到达时Count 将加一,然后检查是否有任何具有这个新到达文件名的文件已经在您的 ArrayList 中,如果没有将此文件内容附加到您的 JTextArea。

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

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

6.main() Swing中 的方法不长命。它在 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线程上同步Non-UI线程的工作输出。

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

9.可以通过扩展线程类或实现 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();
       }
    }
于 2012-07-20T04:53:54.277 回答