2013-09-21 8 views
0

Я строю простой графический интерфейс JFrame, требующий ввода пользователем. Если пользователь нажимает кнопку отправки, он проверяет ввод, либо передает сообщение JOptionPane, сообщающее пользователю полностью заполнить форму, либо сообщает пользователю, что форма отправлена ​​и закрывается. Проблема заключается в том, что если пользователь оставил пустые поля, диалоговое окно сообщения отображает и только добавляет к счету цикла, если вы пытаетесь закрыть его и не позволяет пользователю возвращаться к JFrame для ввода ввода в форму.Сделать диалоговое окно JOptionPane диалоговое окно dissappear после рендеринга

import java.io.*; 
import java.util.*; 
import javax.swing.*; 
import javax.swing.JOptionPane; 
import java.awt.*; 
import java.util.Scanner.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

/** 
* 
* @author joel.ramsey 
*/ 
public class JRStarPhase5 extends JFrame{ 

    public static void main (String [] args) throws IOException { 

    JFrame window = new JRStarPhase5(); 

    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.setVisible(true); 

    }//end main method 
    private boolean validationError; 
    private final JTextField fNameInput; 
    private final JTextField miInput; 
    private final JTextField lNameInput; 
    private final JTextField productChoiceInput; 
    private final JTextField licenseQuantityInput; 
    private final JTextField streetAddressInput; 
    private final JTextField cityInput; 
    private final JTextField stateInput; 
    private final JTextField zipInput; 
    private final JTextField phoneInput; 


    //constructor for JFrame 
    public JRStarPhase5(){ 
     setTitle("JRStar Star Gaze Order Processing"); 
     setSize (800,800); 
     Container pane = getContentPane(); 
     GridLayout grid = new GridLayout(0,2); 
     pane.setLayout(grid); 

     JLabel fNameLabel = new JLabel ("First name:"); 
     JLabel mi = new JLabel ("Middle initial:"); 
     JLabel lNameLabel = new JLabel ("Last name:"); 
     JLabel productChoice = new JLabel ("Star Gaze version:"); 
     JLabel licenseQuantity = new JLabel ("License quantity:"); 
     JLabel streetAddress = new JLabel ("Street address:"); 
     JLabel city = new JLabel ("City:"); 
     JLabel state = new JLabel ("State abbrev:"); 
     JLabel zip = new JLabel ("Zip code:"); 
     JLabel phone = new JLabel ("Phone Number:"); 
     this.fNameInput = new JTextField(15); 
     this.miInput = new JTextField (1); 
     this.lNameInput = new JTextField (15); 
     this.productChoiceInput = new JTextField (1); 
     this.licenseQuantityInput = new JTextField (2); 
     this.streetAddressInput = new JTextField (20); 
     this.cityInput = new JTextField (20); 
     this.stateInput = new JTextField (2); 
     this.zipInput = new JTextField (5); 
     this.phoneInput = new JTextField (10); 

     //add as last buttons 
     JButton submit = new JButton("Submit"); 
     SubmitButtonHandler sbh = new SubmitButtonHandler(); 
     submit.addActionListener(sbh); 

     JButton clear = new JButton("Clear"); 
     ClearButtonHandler cbh = new ClearButtonHandler(); 
     clear.addActionListener(cbh); 

     pane.add(fNameLabel); 
     pane.add(fNameInput); 
     pane.add(mi); 
     pane.add(miInput); 
     pane.add(lNameLabel); 
     pane.add(lNameInput); 
     pane.add(productChoice); 
     pane.add(productChoiceInput); 
     pane.add(licenseQuantity); 
     pane.add(licenseQuantityInput); 
     pane.add(streetAddress); 
     pane.add(streetAddressInput); 
     pane.add(city); 
     pane.add(cityInput); 
     pane.add(state); 
     pane.add(stateInput); 
     pane.add(zip); 
     pane.add(zipInput); 
     pane.add(phone); 
     pane.add(phoneInput); 

     //add last 
     pane.add(submit); 
     pane.add(clear); 

    }//end constructor 

    private class SubmitButtonHandler implements ActionListener{ 


     public void actionPerformed(ActionEvent e){ 

      validationError = (fNameInput.getText().equals("")|| 
      miInput.getText().equals("")|| 
      lNameInput.getText().equals("")|| 
      streetAddressInput.getText().equals("")|| 
      cityInput.getText().equals("")|| 
      stateInput.getText().equals("")|| 
      zipInput.getText().equals("")|| 
      phoneInput.getText().equals("")); 

      for (int n=1; n<3; n++){ 

      if (validationError){ 

       if (n == 3){ 
        System.exit(0); 
       } 

      JOptionPane.showMessageDialog(null,"Please complete each field within the order form."); 

      } 

      else break; 

      } 

      if (validationError = false) 

       JOptionPane.showMessageDialog(null,"Your order has been submitted!"); 
       System.exit(0); 
     } 

    }//end submit 

    private class ClearButtonHandler implements ActionListener{ 

     public void actionPerformed(ActionEvent e){ 

      fNameInput.setText(""); 
      miInput.setText(""); 
      lNameInput.setText(""); 
      productChoiceInput.setText(""); 
      licenseQuantityInput.setText(""); 
      streetAddressInput.setText(""); 
      cityInput.setText(""); 
      stateInput.setText(""); 
      zipInput.setText(""); 
      phoneInput.setText(""); 
     } 

    }//end clear 

}//end main class 

ответ

1

Я честно не знаю, что еще вы ожидали (без обид).

Свинг - это среда, управляемая событиями. Событие происходит, вы реагируете на него ...

Цикл будет выполняться в контексте EDT для начала, что означает, что пользователь не может фактически закрыть диалоговое окно, исправить ошибку и попытаться повторить -Отправить.

Даже если это было сделано, цикл не позволяет переопределять переменную validationError, то есть всегда будет то, что изначально было установлено ранее в методе (предположим, что теперь true). ..

for (int n = 1; n < 3; n++) { 
    if (validationError) { 
     if (n == 3) { 
      System.exit(0); 
     } 
     JOptionPane.showMessageDialog(null, "Please complete each field within the order form."); 
    } else { 
     break; 
    } 
} 

if (validationError = false) { 
    JOptionPane.showMessageDialog(null, "Your order has been submitted!"); 
} 
System.exit(0); 

Так в основном у вас есть смертельная ловушка, там просто нет способа избежать ...

Возьмема другого подхода. Вместо использования жесткого контура, такого как for или while, мы можем создать мягкую петлю, при которой каждый раз, когда метод выполняется, и форма недействительна, мы обновляем счетчик до тех пор, пока не закончится счетчик ...

// How many times retries has the user used... 
private int retries = 0; 

/*...*/ 

public void actionPerformed(ActionEvent e) { 

    validationError = (fNameInput.getText().equals("") 
      || miInput.getText().equals("") 
      || lNameInput.getText().equals("") 
      || streetAddressInput.getText().equals("") 
      || cityInput.getText().equals("") 
      || stateInput.getText().equals("") 
      || zipInput.getText().equals("") 
      || phoneInput.getText().equals("")); 

    if (validationError) { 
     retries++; 
     if (retries < 3) { 
      JOptionPane.showMessageDialog(this, "Please complete each field within the order form."); 
     } else { 
      JOptionPane.showMessageDialog(this, "You've used up all your tries..."); 
      System.exit(0); 
     } 
    } else { 
     JOptionPane.showMessageDialog(this, "Your order has been submitted!"); 
     System.exit(0); 
    } 
} 

Вам также может понравиться иметь чтение из Validating Input из How to use the focus subsystem учебника ...

Смежные вопросы