如何在使用JTextField时等待用户输入

问题描述:

我最近使用System.out.println()创建并完成了使用IDE处理IDE的程序的第一阶段;什么不是。现在,我想给这个程序一个GUI,我遇到了一个问题。这是我的MCV例子(或者至少我认为是,如果不是,请告诉我)。如何在使用JTextField时等待用户输入

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循环中。这是我的问题。

+0

如果一切都失败了,我可以用一个JButton采取输入,但即使这样,我仍然不知道如何停止while循环 – DreadHeadedDeveloper 2014-10-05 02:17:04

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