使用JTextFields时如何等待用户输入

时间:2014-10-05 02:13:09

标签: java swing user-interface jtextfield

我最近使用System.out.println()构建并完成了使用IDE的java程序的第一阶段;什么不是。现在,我想给这个程序一个GUI,我遇到了一个问题。这是我的MCV示例(或者至少我认为是,如果不是,请告诉我。)

import java.net.*;
import java.net.UnknownHostException;
import java.net.NoRouteToHostException;
import java.io.*;
import net.sf.json.*;
import org.apache.commons.lang.exception.*;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.BoxLayout;
import javax.swing.JOptionPane;
import java.awt.Component;
import java.awt.Container;
import java.util.Scanner;


public class WOT_PlayerComp_V2
{

   public static JFrame f;
   public static JLabel resultLabel;
   public static JPanel p;
   public static JTextField t;
   public static String comparisonResults = "";
   public static String holder = "";
   public static String playerName = "";
   public boolean gameIsStillRunning = true;

   public static void testGUI()
   {
      f = new JFrame();

      addComponentsToPane(f.getContentPane());



      f.setSize(300, 400);
      f.setLocation(200, 200);
      // f.setResizable(false);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      f.setVisible(true);

   }

   public static void addComponentsToPane(Container c)
   {
      c.setLayout(new BoxLayout(c, BoxLayout.Y_AXIS));

      p = new JPanel();
      t = new JTextField(15);
      //t.setDocument(new JTextField_wLimit(50));
      //You can ignore this line, it is what I used to limit the input of my textfield
      resultLabel = new JLabel();


      //html makes the br have purpose, p makes it wrap
      resultLabel.setHorizontalAlignment(SwingConstants.CENTER);
      resultLabel.setVerticalAlignment(SwingConstants.TOP);
      resultLabel.setSize(50, 50);

      c.add(t);
      c.add(resultLabel);


   }

   public WOT_PlayerComp_V2()
   {

      testGUI();

   //... Lots of irrelevant code

      resultLabel.setText("Enter your username.");

      while(gameIsStillRunning)
      {

      //irrelevant code

         playerName = t.getText();//scans user input
         t.setText("");

      //more irrelevant code
      }

      //if(playerName == null || playerName.equals(""))
      //^^ it shouldn't go into here, I want my while loop to wait 
      //for user input like it did when i was using a Scanner object
      //

   }

   public static void main(String[] args)
   {

      WOT_PlayerComp_V2 w = new WOT_PlayerComp_V2();

   }

}

基本上,在我使用JTextField对象之前,我使用的是Scanner对象。 Scanner对象实际上会停止我的while循环并运行该方法,然后继续。我想知道这是否可以使用JTextField。我希望能够在中间停止for循环并等待用户输入。对于我上面的MCV示例来说,它似乎并不是一个大问题,但我使用的代码主要依赖于输入,并将响应输入null或空字符串的用户。因此,它将执行它的意图,响应正确的用户输入,这将只持续一次迭代,然后它将继续从JTextField获取输入,因为它处于while循环中。这是我的问题。

1 个答案:

答案 0 :(得分:2)

GUI程序不像这样工作,就像在控制台程序中一样。没有"等待用户输入" 就像使用Scanner一样。使用Swing,事件会被用户的不同交互触发。这是你的工作,作为程序员通过向触发你想要监听的事件的组件添加适当的监听器来监听这些事件。例如,您可以在文本字段上侦听ActionEvent(当用户点击输入时会触发该事件。您将ActionListener添加到将要侦听的文本字段中对于那些事件。当事件发生时,你可以做一些处理。

final JTextField field = new JTextField(20);
field.addActionListener(new ActionListener(){
    @Override
    public void actionPerformed(ActionEvent e) {
        String text = field.getText();
        System.out.println(text);
        field.setText(text);
    }
});

请花点时间浏览Writing Event Listeners