JavaFX TextArea 字符串读取问题

Posted

技术标签:

【中文标题】JavaFX TextArea 字符串读取问题【英文标题】:JavaFX TextArea string reading issue 【发布时间】:2020-05-17 16:31:09 【问题描述】:

我正在尝试在 JavaFX 中创建一个登录系统,我需要检查与电子邮件对应的 textArea 的字符串是否与我的 User 类中的电子邮件变量相同。但是,我用于将 textArea 中的字符串与用户详细信息进行比较的方法将始终返回 false。我不确定为什么。我试过 .equals()、.compareTo 甚至 .charAt() 并用 1 个字母对其进行了测试,它仍然会返回 false。

这是我的方法代码。请注意,这是我用于将 textArea 中的字符串与 User.getEmail 中的字符串进行比较的方法。

public boolean checkCredentials()
    
        return text1.getText().equals(user.getEmail());
    

这是我的 User 类中方法 .getEmail() 的代码:

private String email = "1";
public String getEmail()

    return email;

此外,即使 textArea 中的输入为“1”,我的用户类中的字符串 Email 为“1”,我仍然得到返回 false:

public boolean checkCredentials()
    
        return text1.getText().length() == user.getEmail().length();
    

我的猜测是,textArea 中的字符串在某处比 User 类中的字符串具有“额外”的内容。我试过打印出两个字符串的长度,我得到了相同的答案。

重新创建所需的最少代码,注意必须安装 JavaFX,并且必须使用 JavaFX 应用程序模板:

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Main extends Application


    Stage window;
    Scene scene1;

    String sEmail;

    // TextBoxes Dec.
    TextArea text1 = new TextArea();

    public static void main(String[] args)
    
        launch(args);
    

    public boolean checkCredentials()
    
        return text1.getText().equals(sEmail);
    

    @Override
    public void start(Stage primaryStage)
    
        window = primaryStage;

        sEmail = "1";

        // TextBoxes Ini.
        text1.setMaxWidth(200);
        text1.setMaxHeight(25);
        text1.setMinHeight(25);

    // Button
    Button button1 = new Button("Check string");
        if(checkCredentials())
        
            button1.setOnAction(e -> System.out.println("The email is correct"));
        
        else
        
            button1.setOnAction(e -> System.out.println("The email is NOT correct"));
        

        // Layout1
        VBox layout1 = new VBox(20);
        layout1.setAlignment(Pos.CENTER);
        layout1.getChildren().add(text1, button1);
        scene1 = new Scene(layout1, 750, 500);

        window.setScene(scene1);
        window.setTitle("Hello");
        window.show();
    


【问题讨论】:

在返回布尔值之前,尝试打印每个 text1 和用户的内容和长度。 根据您提供的信息无法确定问题所在。您似乎使用了错误的输入进行读取,但我们无法确定。但是,您可以简单地设置断点并对其进行调试。然而,我们需要一个minimal reproducible example 我已经尝试打印 text1 和 user.getEmail 的输出,但它们打印的 sxact 相同。例如我做了: button1.setOnAction(e -> System.out.println(text1.getText + "\n" + user.getEmail)) 它会打印: 1 1 在实例化的时候,textArea 的文本是空的——那个时候,检查总是假的。现在,您根据该检查将 不同 actionHandler 注册到按钮。您(很可能)想要做的是检查 inside 的凭据 - 一个 single,无条件注册 - 按钮的 onAction 处理程序 谢谢,现在我看到了问题。检查将始终返回 false,因为检查是在开始时完成的,此时 textArea 中没有任何内容。 【参考方案1】:

上面发布的当前方法将始终返回 false,除非比较的字符串为空。这是因为检查发生在程序运行时,这意味着程序开始时 textArea 中将始终没有任何内容。

要解决此问题,请为按钮创建一个 EventHandler,如下所示:

button1.setOnAction(new EventHandler<ActionEvent>()
        
            @Override
            public void handle(ActionEvent event)
            
                if(text1.getText().equals(user.getEmail()))
                
                    window.setScene(scene2);
                
                else
                
                    AlertBox.display("ALERT!", "Please provide correct details");
                
            
        );

此方法在按下按钮时比较字符串,当它们相同时转到场景2。

P.S AlertBox 是我与 display() 一起制作的一个类。

【讨论】:

以上是关于JavaFX TextArea 字符串读取问题的主要内容,如果未能解决你的问题,请参考以下文章

如何知道用户在 JavaFX TextArea 中选择了哪个文本字符串

将电话号码从 Outlook 粘贴到 JavaFX TextField 或 TextArea 会产生无关字符

JavaFX - TextArea 的掩码文本

从 TextArea 拖动选定文本时出现 Javafx 问题

Javafx 8 替换 textarea 中的文本并保持格式

JavaFX:在进入 TextArea 时将插入符号/光标放在 TextArea 的末尾