java GUI尝试从多个文本字段中获取多个输入

时间:2013-07-31 15:04:41

标签: java swing user-interface io

如何从您创建的多个文本字段中获取多个输入? 我想要一个文本字段来获取端口号,另一个文件字段来获取文件位置。 因此,一旦用户输入int和字符串,我就可以将这些输入用于程序。

我是新手,所以当我尝试实现这个时,我会输入端口号,突然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();
}




   }

2 个答案:

答案 0 :(得分:2)

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

您只应注册按钮的操作。

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

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

答案 1 :(得分:1)

只为您的按钮调用addActionListener(this);,不要在textFields上听取操作,因为在文本字段上发生操作时会调用actionPerformed方法(用户点击输入)。我猜你在第一个字段后执行此操作,并且你的操作方法被调用,然后等待套接字连接,因为这是一个阻塞调用,这会使你的GUI无响应。