从不同的类写入jTextArea

只是想知道是否可以从一个单独的类附加到一个类中的jTextArea? 我基本上有一个简单的类,它不断运行计算,我想在我自己的类中创建的GUI上查看输出。 程序通过System.out.println执行正常,但我想在我的textarea上查看它。 非常感谢任何指导。

更新 – 以下代码是我正在运行的。 有问题的区域如下(这是一个相当大的类的方法):

System.out.println("From Server:" + sentenceFromServer); 

我希望将此输出写入单独的jTextArea,该jTextArea位于下面的类之下的另一个类中。

客户类

 public void run() { SocketForm form = new SocketForm(); //File file=null; long startTime; // Starting time of program, in milliseconds. long endTime; // Time when computations are done, in milliseconds. double time; System.out.println("Variables Set"); String serverName = "localhost"; try { //if (args.length >= 1) // serverName = args[0]; InetAddress serverIPAddress = InetAddress.getByName(serverName); //get server port; int serverPort = form.cliportNo; //if (args.length >= 2) // serverPort = Integer.parseInt(args[1]); //create socket DatagramSocket clientSocket = new DatagramSocket(); //get input from keybaord byte[] sendData = new byte[byteSize]; //BufferedReader inFromUser = new BufferedReader(new InputStreamReader (System.in)); //while (true){ //String sentence = inFromUser.readLine(); startTime = System.currentTimeMillis(); //sendData = sentence.getBytes(); System.out.println("About to identify image"); String fileName = "/Users/Andrew/Desktop/pic.jpg"; File f = new File(fileName); FileInputStream fis = null; try { fis = new FileInputStream(f); System.out.println("Total file size to read in bytes is : " + fis.available()); } catch (IOException e) {} Path path = Paths.get("/Users/Andrew/Desktop/pic.jpg"); //byte[] data = Fles.readAllBytes(path); sendData = Files.readAllBytes(path); try { for( int index = 0; index < sendData.length ; index += byteSize ) { DatagramPacket packet = new DatagramPacket( sendData, index, Math.min( byteSize, sendData.length-index ), serverIPAddress, serverPort); clientSocket.send(packet); //DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverIPAddress, serverPort); //receive datagram byte[] receiveData = new byte [byteSize]; DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); clientSocket.receive(receivePacket); //print output String sentenceFromServer = new String(receivePacket.getData()); System.out.println("From Server:" + sentenceFromServer); } System.out.println("The End"); } catch (Exception e) {} //close client socket //clientSocket.close(); endTime = System.currentTimeMillis(); time = endTime - startTime; System.out.println("Time :" + time); // } } catch (Exception e) {} } 

SocketForm类(GUI)

 public static void main(String args[]) { /* Set the Nimbus look and feel */ // /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html */ try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(SocketForm.class.getName()).log(java.util.logging.Level.SEV } // /* Create and display the form */ java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new SocketForm().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.ButtonGroup buttonGroup1; private javax.swing.JPanel jPanel1; private javax.swing.JPanel jPanel2; private javax.swing.JScrollPane jScrollPane1; private javax.swing.JScrollPane jScrollPane2; private javax.swing.JTabbedPane jTabbedPane1; public static javax.swing.JTextArea jTextArea1; private javax.swing.JTextField jTextField1; private javax.swing.JTextField jTextField2; // End of variables declaration 

}

建议:

  • 为GUI类提供一个公共方法, public void appendText(String text) ,它只是将文本String附加到JTextArea。
  • 任何希望将文本附加到JTextArea的外部类只需要对具有此方法的类具有有效引用,然后需要调用它。
  • 必须注意确保只在Swing事件线程EDT上调用此方法。
  • 由于您将从长时间运行的代码中执行此操作,因此您需要从Swing事件线程执行此长时间运行的代码。 SwingWorker可以很好地完成这项工作。 谷歌和学习本教程,因为它将非常有用。
  • 您应该特别考虑使用SwingWorker并使用发布/处理方法对将字符串从服务器发送到JTextArea,在Swing E vent D ispatch T hread或EDT上。
  • 从未在上面的代码中显示一个空的catch块, catch (IOException e) {} 。 这是与闭着眼睛驾驶摩托车相当的编码。 是的,一开始看起来很有趣,但几乎总是会很糟糕。

编辑
你说:

“如果你说它只适合在EDT上运行它怎么能在已经运行的线程中定义呢?”

我知道两种方式:

  1. 使用SwingWorker作为后台线程,并使用发布/处理方法对。 检查SwingWorker教程,因为这里有很好的描述,或者
  2. 使用标准后台线程并将任何Swing调用放在您传递给SwingUtilities.invokeLater(...)方法的Runnable中。