2013-10-20 58 views
3

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

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

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

我想要这个输出被写入到一个单独的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 */ 
    //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
    /* 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 
    } 
    //</editor-fold> 

    /* 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     

}

+2

是的,这是可能的。也许你应该显示所有相关的代码。 –

+0

同意,这是完全有可能的。但考虑到你的问题信息有限,这是关于所有人都可以告诉你的。试着问一个更好的更完整的问题,这个问题让我们有机会弄清楚什么可能不正确。 –

+0

[如何在触发按钮动作时在循环中逐个显示java JTextarea中控制台输出的可能重复](http://stackoverflow.com/questions/14357418/how-to-display-console-output-in- java-jtextarea-one-by-one-in-a-loop-when-button) – Sage

回答

3

建议:

  • 给该GUI类的公共方法,public void appendText(String text)简单地追加tex t字符串到JTextArea。
  • 任何希望将文本附加到JTextArea的外部类只需具有对具有此方法的类的有效引用,然后需要调用它。
  • 必须注意确保只在Swing事件线程EDT上调用此方法。
  • 由于您将从长期运行的代码中完成此操作,因此您需要在Swing事件线程的之前执行此运行代码。 SwingWorker将为此工作良好。谷歌和研究教程,因为它会非常有用。
  • 您应该考虑具体使用SwingWorker<Void, String>和使用发布/处理方法对从服务器到JTextArea中发送字符串,秋千上Ë发泄d ispatch 牛逼 hread或EDT。
  • 决不有一个空的catch块,正如你在上面代码中,catch (IOException e) {}显示。这是您闭着眼睛驾驶摩托车的代码。是的,起初它看起来很有趣,但它几乎总是会很糟糕。

编辑
幽州:

“如果像你说的只适用于在美国东部时间运行它,这可怎么线程已经运行中定义?“

我知道2种方式:

  1. 使用的后台线程中的SwingWorker,并使用发布/工艺方法对本次检查中的SwingWorker教程,因为这是好有描述,或
  2. 使用标准的后台线程,并把所有的Swing调用一个Runnable里面,你传递给SwingUtilities.invokeLater(...)方法。
+0

嗯,相当于驾驶一辆摩托车,闭着眼睛:-) – mKorbel

+0

感谢您的反馈。我试图在另一个线程上运行,但你仍然没有快乐。然而,我创建了一个测试类,并尝试追加到该类的textarea,并且完美地工作。使用的代码只是SocketForm.jTextField2.setText(“Test”);看来这个命令不会在客户端类的线程中运行。如果您所说的只适合在EDT上运行它,那么如何在已经运行的线程内定义呢? – Reidacus

+0

@Reidacus:请参阅编辑回答。\ –