GUI的输入验证

时间:2017-12-07 01:57:04

标签: java validation

我的程序工作正常,我只需要输入0a negative number长度后输入验证“无效输入,数字必须为正”对话框:{{ 1}}和宽度:tLength

这是我的代码运行正常,只需需要添加验证

tWidth

我试过

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

public class FloorsRUs extends JFrame implements ActionListener, ItemListener 
{

    public JTabbedPane jTP;
    public JRadioButton flrWood = null;
    public JRadioButton flrCarpet = null;
    public JTextField tCName;
    public JTextField tAddress;
    public JTextField tLength;
    public JTextField tWidth;
    public JButton calcArea; 
    public JButton calcCost;
    public JButton subOrder;
    public JButton orderSum;
    public JButton ordList;
    public JPanel flrPan; 
    public JPanel lwPan;
    public JPanel cPan;
    public JLabel lab1;
    public JLabel lab2;
    public JLabel lab3;
    public JLabel lab4;
    public String flrType;
    public double area = 0;
    public double cost = 0;


    FloorsRUs(String title)
    {
        super(title);
        jTP=new JTabbedPane();
        flrPan=new JPanel();
        lwPan=new JPanel();
        cPan=new JPanel();

        flrPan.add(flrWood=new JRadioButton("Choose Wood"));
        flrPan.add(flrCarpet=new JRadioButton("Choose Carpet"));

        ButtonGroup grp = new ButtonGroup();
        grp.add(flrWood);
        grp.add(flrCarpet);

        lwPan.add(lab1=new JLabel("Enter the Length : "));
        lwPan.add(tLength=new JTextField(10));

        lwPan.add(lab2=new JLabel("Enter the Width"));
        lwPan.add(tWidth=new JTextField(10));

        lwPan.add(calcArea=new JButton("Calculate the Area"));
        lwPan.add(calcCost=new JButton("Calculate the Cost"));
        lwPan.add(subOrder=new JButton("Submit the Order"));

        cPan.add(lab3=new JLabel("Enter the Customers Name : "));
        cPan.add(tCName=new JTextField(10));

        cPan.add(lab4=new JLabel("Enter the Customers Address : "));
        cPan.add(tAddress=new JTextField(10));

        cPan.add(orderSum=new JButton("The Order Summary"));
        cPan.add(ordList=new JButton("The Order List"));

        jTP.addTab("Select Floor Type ",flrPan);
        jTP.addTab("Enter Length and Width ",lwPan);
        jTP.addTab("Customer Info",cPan);
        add(jTP);

        calcArea.addActionListener(this);
        calcCost.addActionListener(this);
        subOrder.addActionListener(this);  
        orderSum.addActionListener(this);
        ordList.addActionListener(this);
        flrWood.addItemListener(this);
        flrCarpet.addItemListener(this);


    }
    @Override
    public void itemStateChanged(ItemEvent ie)

    {
        if(flrWood.isSelected()){
            flrType="Wood";

        }

        else if(flrCarpet.isSelected()){
            flrType="Carpet"; 
        }

    }

    @Override
    public void actionPerformed(ActionEvent ae)
    {

        String source=ae.getActionCommand();

        switch (source) {

        case "Calculate the Area":
            System.out.println("Calc 1 Complete");
            area=Double.parseDouble(tLength.getText())
            *Double.parseDouble(tWidth.getText());
            break;

        case "Calculate the Cost":
            System.out.println("Calc 2 Complete");
            if(flrType.equals("Wood"))
            cost = area *20;
            else if(flrType.equals("Carpet"))
            cost = area *10;
            break;

        case "The Order Summary":
            JOptionPane.showMessageDialog(null,"The Order Summary - Area is :" + 
            ""+area+""+ " The Cost is :  "+cost," Information",
            JOptionPane.INFORMATION_MESSAGE);
            break;

        case "The Order List":
            JOptionPane.showMessageDialog(null,"The Order List : \n Customer's name : 
"+tCName.getText()
            +"\nAddress : "+tAddress.getText()
            +"\n The Area is :"+area
            +"\n The Cost is : "+cost,"Information",
            JOptionPane.INFORMATION_MESSAGE);
            break;

        default:

            break;
        }



    }  

    public static void main(String args[])

    {
        FloorsRUs f1=new FloorsRUs("FloorsRUs Easy App");
        f1.setSize(new Dimension(650,450));
        f1.setVisible(true);
    }

}

由于if(tLength.getText()<=0 && tWidth.getText()<=0) { System.out.println("invalid input, number has to be positive"); } "Bad operand for binary operator '<='".都是tLength,我认为tWidth收到错误。

然后我尝试了

String

它接受了它但在我将case "Calculate the Area": System.out.println("Calc 1 Complete"); area=Double.parseDouble(tLength.getText()) *Double.parseDouble(tWidth.getText()); if((Double.parseDouble(tLength.getText())<=0) && ((Double.parseDouble(tWidth.getText())<=0))) { System.out.println("invalid input, number has to be positive"); } break; 0放入tLength或tWidth字段时没有改变输出。

最后我尝试了

negative number

此外,没有错误,但在输入case "Calculate the Area": System.out.println("Calc 1 Complete"); try { if ((Double.parseDouble(tLength.getText()) < 0) && ((Double.parseDouble(tWidth.getText()) < 0))) { System.out.println("invalid input, number has to be positive"); } else { area = Double.parseDouble(tLength.getText()) * Double.parseDouble(tWidth.getText()); } } catch (NumberFormatException e) { System.out.println("invalid input, number has to be positive"); } break; negative numbers时无效。

我已尝试将0切换为'&&',但没有运气。

2 个答案:

答案 0 :(得分:0)

TL; DR,第二个代码块就是你需要的。

你几乎就在那里:

if(tLength.getText()<=0 && tWidth.getText()<=0)
{
    System.out.println("invalid input, number has to be positive");
}

除了它应该是||之外而不是&amp;&amp;,问题是你试图将String与int进行比较。要使其工作,您需要将String解析为整数,因此只需将您的字符串包装在Integer.parseInt()函数中。您的最终if语句应如下所示:

if (Integer.parseInt(tLength.getText()) <= 0 ||
    Integer.parseInt(tWidth.getText()) <=0 )
{
    System.out.println("invalid input, number has to be positive");
}

下一部分是不必要的,但有助于保持代码整洁:

因为大括号内只有一个单一的语句,你实际上并不需要它们,所以你可以写上面的内容,但是像这样:

if (Integer.parseInt(tLength.getText()) <= 0 ||
    Integer.parseInt(tWidth.getText()) <=0 )
        System.out.println("invalid input, number has to be positive");

以下任何代码行都在if语句代码块之外。

一个稍微复杂的例子: 如果是我,我会使用三元运算符并将结果赋给变量并打印变量,如下所示:

String output = Integer.parseInt(tLength.getText()) <= 0 ||
                Integer.parseInt(tWidth.getText()) <= 0 ? 
               "invalid input, number has to be positive" : "";
System.out.println(output);

这基本上是几行代码集合在一起。前两个单词创建了&#39;输出&#39;变量。关于&#34; =&#34;的RHS的事情是三元手术。 三元操作只是一个if语句 如果&#34; x&#34; =真然后做A. 否则做B。

因此,如果Integer.parseInt(tLength.getText())&lt; = 0为真,那么字符串&#34;无效输入,数字必须是正数&#34;将被分配给变量&#39;输出&#39;。 但是如果Integer.parseInt(tLength.getText())&lt; = 0为false,那么字符串&#34;&#34; (空字符串)将被分配到&#39;输出&#39;。这个特殊的三元运算也对Integer.parseInt(tWidth.getText())执行相同的测试,因此如果其中任何一个为真,则使用第一个选项。 最后一行打印出&#39;输出&#39;的内容。并将光标放在下一行。这意味着如果打印空字符串,则光标仍将移动到下一行,但它不会打印任何内容。将光标移动到下一行可能是您想要做的也可能不是(如果您不想,您可以始终使用System.out.print()而不是System.out.println())。

希望有所帮助。

答案 1 :(得分:0)

我最终使用了JOptionPane并使用了这个有效的代码。谢谢大家的帮助,我很感激。

$students