2013-07-31 29 views
0

如何从您创建的多个文本字段获取多个输入? 我想要一个文本字段获取端口号,另一个获取文件位置。 所以一旦用户输入int和字符串,我可以使用这些输入的程序。java GUI尝试从多个文本字段获取多个输入

我对此很陌生,所以当我试图实现这一点时,我会输入端口号,并突然UI似乎“冻结”,我无法进入文件位置。

构造为框架

public TcpServerCompareCSV() { 
     setLayout(new FlowLayout()); 
     // "this" Frame sets its layout to FlowLayout, which arranges the components 
     // from left-to-right, and flow to next row from top-to-bottom. 

     lblPort = new Label("Port");   // construct Label 
     add(lblPort);       // "this" Frame adds Label 

     tfPort = new TextField("0", 10); // construct TextField 
     tfPort.setEditable(true);   //edit text 
     add(tfPort);      // "this" Frame adds tfCount 
     tfPort.addActionListener(this); // for event-handling 



     lblLocation = new Label("CSV File Location"); // construct Label 
     add(lblLocation);        // "this" Frame adds Label 

     tfLocation = new TextField("text", 40);  // construct TextField 
     tfLocation.setEditable(true);     //edit text 
     add(tfLocation);        // "this" Frame adds tfCount 
     tfLocation.addActionListener(this); 


     setTitle("compare");  // "this" Frame sets title 
     setSize(250, 100);  // "this" Frame sets initial window size 
     setVisible(true);   // "this" Frame shows 


     addWindowListener(this); 
     // "this" Frame fires WindowEvent its registered WindowEvent listener 
     // "this" Frame adds "this" object as a WindowEvent listener 

    } 

动作事件

/** ActionEvent handler - Called back when user clicks the button. */ 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
    // Get the String entered into the TextField tfPort, convert to int 
     port = Integer.parseInt(tfPort.getText()); 


     fileLocation = tfLocation.getText(); 
     String csvName = fileLocation; 








    ServerSocket serverSocket = null; 

    try { 
     serverSocket = new ServerSocket(port); 
     } 
    catch (IOException e) 
     { 
     System.err.println("Could not listen on port: 57635."); 
     System.exit(1); 
     } 

    Socket clientSocket = null; 
    System.out.println ("Waiting for connection....."); 

    try { 
     clientSocket = serverSocket.accept(); 
     } 
    catch (IOException e) 
     { 
     System.err.println("Accept failed."); 
     System.exit(1); 
     } 

    System.out.println ("Connection successful"); 
    System.out.println ("Waiting for input....."); 

    PrintWriter out = null; 
try { 
    out = new PrintWriter(clientSocket.getOutputStream(), 
             true); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    BufferedReader in = null; 
try { 
    in = new BufferedReader( 
       new InputStreamReader(clientSocket.getInputStream())); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

    String inputLine, outputLine; 

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



      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); 

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



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


    out.close(); 
    try { 
    in.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    try { 
    clientSocket.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 
    try { 
    serverSocket.close(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 




    } 
+1

看来你正在'actionPerformed'中执行很多耗时的任务。这些任务在主线程上执行,这确实会导致您的GUI冻结。您应该研究如何在后台线程上执行这些任务。 –

回答

2

通过将ActionListener添加到两个文本字段中,如果我没有记错的话,只要您点击其中一个的Return,就会触发事件。 这将立即触发您的网络代码。

您应该只注册该按钮的动作。

此外,正如在评论中已经指出的,您正在GUI线程上执行网络通信,导致冻结。

在操作实现中,您必须生成一个单独的线程来执行实际的网络通信以防止阻塞。要了解它的工作方式,请查看Runnable和Executor框架的文档。

1

只有打电话addActionListener(this);您的按钮,不听你的文本框的行动,因为行动发生时被调用的方法actionPerformed在你的文本区域(用户点击输入)。我猜你在第一个字段后面这样做,并且你的动作方法被这个调用,然后等待套接字连接,因为这是一个阻塞调用,这会让你的GUI没有响应。

相关问题