0

如何从您创建的多个文本字段中获取多个输入?我想要一个文本字段来获取端口号,另一个来获取文件位置。因此,一旦用户输入了 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();
}




   }
4

2 回答 2

2

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

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

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

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

于 2013-07-31T15:10:08.203 回答
1

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

于 2013-07-31T15:08:33.897 回答