【问题标题】:Java, JTextField .equalsJava, JTextField .equals
【发布时间】:2016-11-28 11:58:53
【问题描述】:

我正在尝试比较 JTextField 中的验证部分的值,以确保在所有 TextField 都没有值的情况下用户无法保存进度。

这是我的文本字段方法。

public void DrawBookAttributes() {
    lblBookName = new JLabel("Book Name :");
    lblBookName.setFont(getLblFont());
    lblBookName.setSize(140, 20);
    lblBookName.setLocation(280, 150);
    menuFrame.add(lblBookName);

    tfBookName = new JTextField();
    tfBookName.setSize(140, 20);
    tfBookName.setLocation(420, 150);
    menuFrame.add(tfBookName);

    lblBookID = new JLabel("Book ID :");
    lblBookID.setFont(getLblFont());
    lblBookID.setSize(140, 20);
    lblBookID.setLocation(280, 50);
    menuFrame.add(lblBookID);

    tfBookID = new JTextField();
    tfBookID.setSize(140, 20);
    tfBookID.setLocation(420, 50);
    tfBookID.setText("hello");
    tfBookID.setEditable(false);
    menuFrame.add(tfBookID);

    JLabel lblBookCost = new JLabel("Cost (£) :");
    lblBookCost.setFont(getLblFont());
    lblBookCost.setSize(140, 20);
    lblBookCost.setLocation(280, 200);
    menuFrame.add(lblBookCost);

    tfBookCost = new JTextField();
    tfBookCost.setSize(140, 20);
    tfBookCost.setLocation(420, 200);
    tfBookCost.addKeyListener(this);
    menuFrame.add(tfBookCost);

    lblBookYearOfPublication = new JLabel("Publication Date :");
    lblBookYearOfPublication.setSize(140, 20);
    lblBookYearOfPublication.setLocation(280, 250);
    lblBookYearOfPublication.setFont(getLblFont());
    menuFrame.add(lblBookYearOfPublication);

    JTextField tfBookYearOfPublication = new JTextField();
    tfBookYearOfPublication.setSize(140, 20);
    tfBookYearOfPublication.setLocation(420, 250);
    tfBookYearOfPublication.setText("DD-MM-YYYY");
    tfBookYearOfPublication.addActionListener(this);
    menuFrame.add(tfBookYearOfPublication);

    JLabel lblbookPublishngHouse = new JLabel("Publishing Orgaisation :");
    lblbookPublishngHouse.setSize(140, 20);
    lblbookPublishngHouse.setLocation(280, 300);
    lblbookPublishngHouse.setFont(getLblFont());
    menuFrame.add(lblbookPublishngHouse);

    JTextField tfBookPublishingHouse = new JTextField();
    tfBookPublishingHouse.setSize(140, 20);
    tfBookPublishingHouse.setLocation(420, 300);
    menuFrame.add(tfBookPublishingHouse);

    JLabel lblBookISBN = new JLabel("ISBN :");
    lblBookISBN.setSize(140, 20);
    lblBookISBN.setLocation(280, 350);
    lblBookISBN.setFont(getLblFont());
    menuFrame.add(lblBookISBN);

    JTextField tfBookISBN = new JTextField();
    tfBookISBN.setSize(140, 20);
    tfBookISBN.setLocation(420, 350);
    menuFrame.add(tfBookISBN);

    JLabel lblBookPages = new JLabel("Number of Pages :");
    lblBookPages.setSize(140, 20);
    lblBookPages.setLocation(280, 400);
    lblBookPages.setFont(getLblFont());
    menuFrame.add(lblBookPages);

    JTextField tfBookPages = new JTextField();
    tfBookPages.setSize(140, 20);
    tfBookPages.setLocation(420, 400);
    menuFrame.add(tfBookPages);

    menuFrame.setVisible(true);
}

这是验证部分

    public void EntryCheck() {

        if (tfBookName.getText().equals("")) {
            EntryChecker++;
            System.out.println(EntryChecker);
        }
        if (tfBookISBN.getText().equals("")) {
            EntryChecker++;
        }
        if (tfBookCost.getText().equals("")) {
            EntryChecker++;
        }
        if (tfBookPages.getText().equals("")) {
            EntryChecker++;
        }
        if (tfBookPublishingHouse.getText().equals("")) {
            EntryChecker++;
        }
        if (tfBookYearOfPublication.getText().equals("")) {
            EntryChecker++;
        }
        if (tfBookCost.getText().equals("DD-MM-YYY")) {
            EntryChecker++;
        }
        System.out.println(EntryChecker);
}

EntryChecker 是一个整数,每次当用户离开 TextField 而不在其中输入信息时,我都会为其添加一个值。

每次调试程序时,我都会在此验证行中遇到 NullPointerException。

if (tfBookISBN.getText().equals("")) {
        EntryChecker++; 

任何人都知道问题出在哪里以及如何解决?

谢谢!

【问题讨论】:

  • 您确定 if 语句中的 tfBookISBN 与创建字段时的对象引用相同吗?我的意思是上面代码的范围是什么,你有一个全局的 tfBookISBN 吗?另一个在方法中?即发布更多代码:)
  • @Yazan tfBookISBN 是全局和私有的,我在一个方法中声明它并在同一个类中的另一个方法中访问它。
  • @Yazan 根据您的要求添加了两种方法中的所有代码。
  • 我已经在下面发布了答案。

标签: java swing user-interface jtextfield


【解决方案1】:

如果 - 正如你在 cmets 中所说的 - 你有

private JTextField tfBookISBN = new JTextField();

类中的全局范围,那么您必须删除该行

JTextField tfBookISBN = new JTextField();

来自DrawBookAttributes()

如果在声明时它没有被初始化(我认为它不是),你需要在DrawBookAttributes()中保留那行但是作为初始化,而不是声明,如下所示:

tfBookISBN = new JTextField();

因为您在方法中创建了一个新字段,并且未初始化全局字段,这会在EntryCheck() 尝试访问该对象以调用getText() 时创建一个 NPE。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2012-02-20
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-08
    • 2012-01-08
    相关资源
    最近更新 更多