首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java试图从多个文本字段获取多个输入

java试图从多个文本字段获取多个输入
EN

Stack Overflow用户
提问于 2013-07-31 15:04:41
回答 2查看 4.4K关注 0票数 0

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

我对此并不熟悉,所以当我尝试实现它时,我会输入端口号,突然UI看起来“冻结”了,我无法输入文件位置。

框架构造函数

代码语言:javascript
复制
   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

   }

动作事件

代码语言:javascript
复制
   /** 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();
}




   }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-31 15:10:08

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

您只应该为按钮注册操作。

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

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-31 15:08:33

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17974065

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档