gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:38:42 26 4
gpt4 key购买 nike

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

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

任何建议?谢谢你的每一个建议

已编辑
我是这样编码的,但是它没有附加在我的 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. 我假设如果有两台机器参与,那么你必须在双方发送和接收。

2. 所以你需要保持一个 单独的线程 ,这将是 运行在你的 EDT(事件调度线程)中,它是你的 GUI 线程。x7056

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

4. 当一个 新文件到达 时, 计数将增加一个 ,然后用这个文件名是否已经附加到你的文件名中 JTextArray

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

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

6. Swing 中的 main() 方法是 不长生命周期 。它在事件调度器线程中调度 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线程的Work Output

///////////////////编辑////////////////////////

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. 您还可以使用实现 Runnable 的匿名内部类。

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

关于java - 在 Java GUI 中动态更新文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11572784/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com