【问题标题】:JOptionPane input validationJOptionPane 输入验证
【发布时间】:2014-04-10 14:53:03
【问题描述】:

我正在寻找一种通过 JOptionPane showConfirmDialog 检查用户输入的好方法,确保它包含一个字符串和一个可信的年龄。这个想法是使用这些输入并将它们添加到一个对象中,然后将其添加到一个 ArrayList 中。

问题出在下面的“NyLis”类中”。 名称 = Namn,土地 = 国家。奥尔德 = 年龄。年龄应该在 18 到 100 岁之间。

  1. 有没有办法检查字符串是否为实际字符串?
  2. 有没有办法在输入无效的情况下返回窗口,并保留之前的输入,以便用户在哪里出错?
  3. try 和 catch 块在这里是一个不错的选择吗?我将如何实现它们?

我一直在玩while 循环并尝试catch 块,但我无法将我的愚蠢的头脑全部包住。

非常感谢任何帮助。

// JOptionPane 窗口

        Form(){

        setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));

        JPanel rad0 = new JPanel();
        rad0.add(new JLabel("StartNr: "+ list.size()+1+""));
        add(rad0);

        JPanel rad1 = new JPanel();
        rad1.add(new JLabel("Namn: "));
        namnFält = new JTextField(15);
        rad1.add(namnFält);
        add(rad1);

        JPanel rad2 = new JPanel();
        rad2.add(new JLabel("Land: "));
        landFält = new JTextField(15);
        rad2.add(landFält);
        add(rad2);

        JPanel rad3 = new JPanel();
        ålderFält = new JTextField(5);
        rad3.add(ålderFält);
        rad3.add(new JLabel("Ålder: "));

        rad3.add(ålderFält);
        add(rad3);


    }

}

// 监听器

class NyLis implements ActionListener{
    public void actionPerformed(ActionEvent ave){

        Form f = new Form();            

        int svar = JOptionPane.showConfirmDialog(null, f);
        if (svar != JOptionPane.OK_OPTION)

            return;

            String namn = f.namnFält.getText();
            String land = f.landFält.getText();
            int ålder = Integer.parseInt(f.ålderFält.getText());

            boolean success=false;

            while(!success){
            JOptionPane.showMessageDialog(null, "Fel. Försök igen.");
            int svar2 = JOptionPane.showConfirmDialog(null, f);
            if (svar2 != JOptionPane.OK_OPTION)

            return;

            if(!namn.isEmpty() && !land.isEmpty()&&!(ålder<18 || ålder>100)){           
            success=true;

             int startNr = list.size()+1;


           Tävlande tv = new Tävlande (namn,land,ålder,startNr,Double.MAX_VALUE);
            list.add(tv);
            visa.setEnabled(true);

                    }

                        }



                }
        }

// 对象

public class Tävlande implements Comparable<Tävlande>{



    private String namn;
    private String land;
    private int ålder;
    private int startNr;
    private double tid;

    public Tävlande (String namn, String land,int ålder,int startNr, double tid){
        this.namn = namn;
        this.land = land;
        this.ålder = ålder;
        this.startNr = startNr;
        this.tid = tid;
    }

    public String getNamn(){
        return namn;
    }


    public String getLand(){
        return land;
    }

    public int getÅlder(){
        return ålder;
    }

    public int getStartNr(){
        return startNr;
    }

    public double getTid(){
        return tid;
    }

    public void setTid(Double tid) {
        this.tid = tid;
    }

    public String toString(){
        String str =  namn +" "  + ", Land: "+land + ", Ålder: " +ålder+ ", Startnummer: " + " "+startNr;
        return str;

    }
    public String toString2(){
        String str =  namn +" "  + ", Land: "+land + ", Ålder: " +ålder+ ", Startnummer: " + " "+startNr+  ", Tid: "+tid;
        return str;

    }
    public boolean equals(Object other){
        if (other instanceof Tävlande){
            Tävlande t = (Tävlande) other;
            if (startNr == t.startNr)
                return true;

            else
                return false;

        }
        else{
            return false;
        }
    }

    @Override

    public int compareTo(Tävlande other) {
        if(startNr < other.startNr)
            return -1;  
        else if (startNr > other.startNr)
            return 1;
        else 
            return 0;

    }

}

【问题讨论】:

  • 为了尽快获得更好的帮助,请发布MCVE(最小完整且可验证的示例)。

标签: java swing user-interface while-loop joptionpane


【解决方案1】:
SpinnerNumberModel ageModel = new SpinnerNumberModel(25, 18, 100, 1);
JSpinner ageSpinner = new JSpinner(ageModel);
JOptionPane.showMessageDialog(
    frame, ageSpinner, "Age?", JOptionPane.QUESTION_MESSAGE);
System.out.println(ageSpinner.getValue());

【讨论】:

  • 此外,Land 可以从包含所有国家/地区(或其子集)的 JComboBox 中选择。
  • @dic19 好点。 This answer 使用JVM 的Locale 列表获取国家列表。
【解决方案2】:

嗯,有几种方法可以做到这一点。对于日期,您可以尝试使用字符串拆分等方法将日期按“/”分解,并查看日期是否在相关范围内。

String string = "4/10/2014";
String[] parts = string.split("/");
String part1 = parts[0]; // 4
String part2 = parts[1]; // 10
String part3 = parts[2]; // 2014

然后执行一个 while 循环,如果值不是 Int 或高或低,则将用户循环回开始以获取新输入。

这是上一个关于 Int 验证的问题的链接:Link!

【讨论】:

  • 问题不在于日期
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 2016-03-17
  • 2011-01-06
  • 2011-12-09
  • 2014-12-04
相关资源
最近更新 更多