2013-04-23 18 views
0

안녕하세요. 내 GUI에서 textfield의 유효성을 검사하는 데 도움이 필요합니다. 교수님이하는 방법에 대한 힌트를 주셨지만 프로그램을 멈추게합니다. 나는 다른 방법을 시도했지만 만약 텍스트를 입력하면 다음 창에는 텍스트 필드가 표시되지 않습니다.자바에서 텍스트 필드의 유효성을 검사하는 방법

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에 할당하지 마십시오.

나는 당신이 당신의 while(true) 루프 내부

str = nameField.getText(); 

같은 것을 필요가 있다고 생각합니다. 그는 당신이 루프 (또는 if)를 입력 한 후 str에 대한 값을 할당 결코 말할 때

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

산성이 올바른지 : 당신은이 있기 때문에

+0

내 끝 부분에 여전히 얼어 있습니다. –

1

이 동결된다. 즉, 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 
} 
관련 문제