gpt4 book ai didi

Java同时使用focusLost事件实现多个消息对话框

转载 作者:行者123 更新时间:2023-12-02 05:01:09 25 4
gpt4 key购买 nike

问题是,当我在姓名字段为空时单击姓氏字段时,会出现两条消息,因为当消息对话框出现时,即使姓氏也失去了焦点。我可以做些什么来使程序显示名称消息并将焦点保留在名称字段上?

我尝试了 .requestFocus() 但没有成功。

    private void NameFieldFocusLost(java.awt.event.FocusEvent evt) {                                    
if (NameField.getText().equals('smth')) {
JOptionPane.showMessageDialog(null, "Please put a name!","Error!", JOptionPane.INFORMATION_MESSAGE);
}
}
private void SurnameFieldFocusLost(java.awt.event.FocusEvent evt) {
if (SurnameField.getText().equals("smth")) {
JOptionPane.showMessageDialog(null, "Please put a surname!","Error!", JOptionPane.INFORMATION_MESSAGE);
}
}

最佳答案

首先,在 NameFieldFocusLost 事件中:if (NameField.getText().equals('smth')) { 不起作用。 equals() 方法需要一个字符串: if (NameField.getText().equals("smth")) { 或更好...因为您想确保实际上提供了一个名称:

if (NameField.getText().trim().equals("")) {

一定有什么东西没有向我们展示。我不明白为什么当焦点从 nameFieldFocusLost 事件中移开时,两个 MessageBox 都会显示。除非您有代码在某个地方移动焦点尤其是在表单实际可见之前,否则这种情况不应该发生。 requestFocus() 方法也应该可以正常工作,并且应该显示 MessageBox 后直接调用,例如:

private void nameFieldFocusLost(java.awt.event.FocusEvent evt) {                                    
if (nameField.getText().trim().equals("")) {
JOptionPane.showMessageDialog(this, "Please put a name!","Error!", JOptionPane.INFORMATION_MESSAGE);
nameField.setText(""); // Clear the JTextField in case a white-space was placed there.
nameField.requestFocus(); // Force focus back onto the JTextField.
}
}

如果您在父容器可见之前将焦点移至 JTextField(Form/JDialog),那么您可能会遇到特定问题。

EDIT:

啊...我看到问题了,谢谢您的评论。您可以通过以下几种方法来解决这个困境:

  1. focusLost 事件中添加下一个条件JTextField 处于焦点状态,这将强制退出该事件如果先前关注的 JTextField 的验证失败。

    在您的情况下,您有一个名字文本字段和一个姓氏文本 field 。在姓氏字段的 focusLost 事件中,您将拥有第一行代码是:

    if (nameField.getText().trim().equals("")) { return; }

    这样,剩余的事件代码就不会在姓氏中运行失去焦点事件,除非名称字段验证成功。这整个姓氏事件代码可能如下所示:

    private void surnameFocusLost(java.awt.event.FocusEvent evt) {       
    if (nameField.getText().trim().equals("")) { return; }
    if (surnameField.getText().trim().equals("")) {
    JOptionPane.showMessageDialog(this, "Please put a last name!","Error!", JOptionPane.INFORMATION_MESSAGE);
    surnameField.setText(""); // Clear the JTextField in case a white-space was placed there.
    surnameField.requestFocus(); // Force focus back onto the JTextField.
    }
    }
  2. 另一种方法是利用 InputVerifierClassthis SOpost 中有一个很好的使用示例。 .
  3. 根本不要使用 JTextField 的焦点事件。如果有一个按钮将选择对输入的数据进行进一步处理然后检查所有 JTextField 的验证(在按钮的 actionPerformed 事件中)并强制执行关注失败的字段 (nameField.requestFocus();) 以便正确输入。

关于Java同时使用focusLost事件实现多个消息对话框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56385256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com