0

我正在尝试附加从客户端程序获得的字符串。但是,我这样做是为了让 append 语句处于 while 循环中。然而,这会影响程序,因为不会将消息 REALTIME 发送到 JTextArea。

如何使程序不使用while循环或for循环并继续接受来自客户端的消息并将其实时输出到textarea?也许只是一个 if 语句?

while循环区域

while ((inputLine = in.readLine()) != null) 

对于像这样的领域

   tfFIXMsg.append( inputLine + "\n\n\n");

       tfCSVLine.append(outputLine+"\n\n\n");

在 while 循环完成之前,它不会在 textArea 上显示消息。我怎样才能让它继续接收来自客户端的消息,并能够实时将其输出到 textArea

try {
    while ((inputLine = in.readLine()) != null) 
          { 
           System.out.println ("Server: " + inputLine); 


           tfFIXMsg.append( inputLine + "\n\n\n");


           int pos = inputLine.indexOf(inputLine, 0);
           h.addHighlight(50, 60, DefaultHighlighter.DefaultPainter);



           if (inputLine.trim().equals("Bye.")) {
               System.out.println("Exit program"); 
               break;
               } 

           Scanner input1 = new Scanner(new File(csvName));
           Scanner input2 = new Scanner(new File(csvName));
           Scanner input3 = new Scanner(new File(csvName));
           Scanner input4 = new Scanner(new File(csvName));


           String csvline = getCsvLineVal (getLocation34CSV(getTag34Value(Tag34Location(getTagCSV( parseFixMsg(inputLine ,inputLine))), getValueCSV( parseFixMsg(inputLine ,inputLine))), getVal34(input1,  input2)), getCSVLine( input3,  input4) );
           outputLine = compareClientFixCSV( getTagCSV( parseFixMsg(inputLine ,inputLine)), getValueCSV(parseFixMsg(inputLine ,inputLine)), getCSVTag(csvline), getCSVValue(csvline));

           out.println(outputLine);
           tfCSVLine.append(outputLine+"\n\n\n");

           input1.close();
           input2.close();
           input3.close();
           input4.close();



          }
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
4

2 回答 2

2

我怀疑您的代码正在 UI 线程上处理。UI 线程是更新和呈现屏幕的内容。由于您在 UI 线程上运行了一个 while 循环,因此 UI 无法更新。它忙着运行你的while循环。

答案是启动另一个线程来进行处理。然后,使用SwingWorker回到 UI 线程,并更新您的文本框。这是必要的,因为您不应该从 UI 线程更新 UI 对象。

这是一个帮助您入门的教程。它将更彻底地解释这一点。

于 2013-08-07T18:21:45.497 回答
2

更新 UI 应该发生在 AWT 线程中:

out.println(outputLine);
SwingUtilities.invokeLater(new Runnable()
{
    public void run()
    {
      tfCSVLine.append(outputLine+"\n\n\n");
    }
});
于 2013-08-07T18:28:59.757 回答