渲染后,使JOptionPane消息对话框消失

时间:2013-09-21 09:52:19

标签: java swing

我正在构建一个需要用户输入的简单JFrame GUI。如果用户单击提交按钮,它将检查输入,然后呈现JOptionPane消息,告知用户完全填写表单,或者它告诉用户表单已提交并关闭程序。问题是如果用户留下空白字段,则会显示消息对话框,如果您尝试关闭它,则只会添加循环计数,并且不允许用户返回JFrame以将输入应用于表单。

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 个答案:

答案 0 :(得分:1)

老实说,我不知道你还期待什么(没有冒犯)。

Swing是一个事件驱动的环境。一个事件发生,你对它作出反应......

循环将在EDT的上下文中执行,这意味着用户无法实际关闭对话框,纠正错误并尝试重新提交。

即使它确实如此,循环也不允许重新评估validationError变量的任何机会,这意味着它将始终是最初在方法中设置的内容(让我们假设{{ 1}}现在)...

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

您可能还希望阅读Validating Input教程中的How to use the focus subsystem ...