2013-04-23 23 views
0

您好,我需要在我的GUI中使用一些帮助文本字段。我的教授给了我一个关于如何去做的提示,但它冻结了我的程序。我尝试了其他方法,但如果如果我输入文本文本字段,下一个窗口不显示。如何在java中验证文本字段

import javax.swing.*; 
import java.awt.GridLayout; 
import java.awt.HeadlessException; 
import java.awt.event.*; 

//import statements here 
public class UserWindow extends JFrame 
{ 

    private JTextField nameField, ageField, creditCardField; 
    private JButton backButton, nextButton; 

    public UserWindow() 
    { 
     super("Please enter your information"); 

     setSize(700,400); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setLocationRelativeTo(null); 
     setLayout(new GridLayout(4,2)); 

     buildPanel(); 
     setVisible(true); 

    } 

    private void buildPanel(){ 

     nameField = new JTextField(10); 
     ageField = new JTextField(2); 
     creditCardField = new JTextField(10); 

     backButton = new JButton("Back"); 
     nextButton = new JButton("Next"); 
     nextButton.addActionListener(new NextButton()); 
     backButton.addActionListener(new BackButton()); 

     JLabel NameLabel = new JLabel("Please enter your name"); 

     JLabel ageLabel = new JLabel("Enter your age"); 

     JLabel creditCardLabel = new JLabel("Enter your credit card number"); 

     JPanel panel1 = new JPanel(); 
     JPanel panel2 = new JPanel(); 
     JPanel panel3 = new JPanel(); 
     JPanel panel4 = new JPanel(); 
     JPanel panel5 = new JPanel(); 
     JPanel panel6 = new JPanel(); 
     JPanel panel7 = new JPanel(); 
     JPanel panel8 = new JPanel(); 

     add(panel1); 
     add(panel2); 
     add(panel3); 
     add(panel4); 
     add(panel5); 
     add(panel6); 
     add(panel7); 
     add(panel8); 

     panel1.add(NameLabel); 
     panel2.add(nameField); 
     panel4.add(ageField); 
     panel6.add(creditCardField); 
     panel3.add(ageLabel); 
     panel5.add(creditCardLabel);  
     panel7.add(backButton); 
     panel8.add(nextButton); 

    }//end of panel building 

    //action listeners for fields/buttons 

    private class NextButton implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 
      String str; 
      int age; 
      str = nameField.getText(); 

      if (str.equals("")){ 
       JOptionPane.showMessageDialog(null,"Please enter your name."); 

       while(true){ 
        nameField.requestFocusInWindow(); 
        if(!str.equals("")) 
         break; 
       } 
      } 

      if(e.getSource() == nextButton) 
       new MovieSelection(); 
      setVisible(false); 

     } 
    } 
    private class BackButton implements ActionListener{ 
     public void actionPerformed(ActionEvent e){ 

      if (e.getSource() == backButton) 
       setVisible(false); 
      new SelectUserWindow(); 
     } 
    } 



} 

回答

2

如果最初为空字符串,则永不为str分配新值。

我认为你需要像

str = nameField.getText(); 

while(true)循环内。

+0

它仍然冻结在我的末端 – 2013-04-23 20:52:41

1

据冻结,因为你有这样的:当他说你进入循环(或if)后,你从来没有分配到任何str价值

if (str.equals("")){ 
    JOptionPane.showMessageDialog(null,"Please enter your name."); 
    while(true){ //<- Runs forever 
      nameField.requestFocusInWindow(); 
      if(!str.equals("")) 
       break; 
    } 
} 

酸是正确的。这意味着你永远不会改变str的值,它永远不会而不是等于"",它将永远在循环中运行。循环运行在与用户界面相同的线程中,因此用户界面没有时间去做任何事情(因此它冻结了)。

在这种情况下永久运行循环是没有意义的。看起来你正在试图让GUI忙着等到用户输入一个名字。 不要那样做。相反,请检查用户是否输入了某些内容,如果不是,请提醒用户并等待用户再次单击该按钮。

因此,请删除循环并使用简单的if-else语句。

if (str.equals("")){ //User have not entered anything. 
    JOptionPane.showMessageDialog(null,"Please enter your name."); 
    nameField.requestFocusInWindow(); 
    //Do NOT loop here. 
} 
else { 
    //Do everything you need to do when the user have entered something 
}