从 Java 中的多个 JTextFields 中单击鼠标清除文本

Clearing text on mouse click from multiple JTextFields in Java

我正在用两个 JTextField 进行一些错误检查。我将它们标记为 jtext1jtext2

现在我的 GUI 看起来像这样:

Enter number 1: [      ] // jtext1
Enter number 2: [      ] // jtext2
Convert         [ answer ]

我希望能够检查多个条件并显示错误消息。例如,如果用户在两个文本字段中均未输入任何内容,并点击转换,则应出现以下内容:

Enter number 1: [  Nothing entered    ] // jtext1
Enter number 2: [  Nothing entered    ] // jtext2
Convert         [ answer ]

而且,如果您使用鼠标单击 jtext1,我希望它能清除消息,以便用户可以输入数字。如果他们点击 jtext2,同样的事情也会发生。

例如,如果我点击 jtext2,应该会出现以下内容:

Enter number 1: [  Nothing entered    ] // jtext1
Enter number 2: [        ]              // jtext2
Convert         [ answer ]

问题是,这段代码:

if(!jtext1.isvalid()) {
    jtext1.setText("Nothing entered");
    jtext1.addMouseListener(new MouseAdapter(){
        @Override
        public void mouseClicked(MouseEvent e) {
            jtext1.setText("");
        }
    });
}

if(!jtext2.isvalid()) {
    jtext2.setText("Nothing entered");
    jtext2.addMouseListener(new MouseAdapter(){
        @Override
        public void mouseClicked(MouseEvent e) {
            jtext2.setText("");
        }
    });
}

只有 jtext1 有效。这对我来说很有意义,因为我不认为我可以继续覆盖相同的功能,但我将如何解决这个问题?

我认为如果您创建另一个可以显示提示的 class 会更好,这样您需要再次执行此操作时会更容易。 这是它如何工作的示例,摘自 another question on SO

class HintTextField extends JTextField implements FocusListener {

  private final String hint;
  private boolean showingHint;

  public HintTextField(final String hint) {
    super(hint);
    this.hint = hint;
    this.showingHint = true;
    super.addFocusListener(this);
  }

  @Override
  public void focusGained(FocusEvent e) {
    if(this.getText().isEmpty()) {
      super.setText("");
      showingHint = false;
    }
  }
  @Override
  public void focusLost(FocusEvent e) {
    if(this.getText().isEmpty()) {
      super.setText(hint);
      showingHint = true;
    }
  }

  @Override
  public String getText() {
    return showingHint ? "" : super.getText();
  }
}

您可以使用它,然后将您的 JTextField 设置为 new HintTextField("What you want your hint to be")。您可以根据自己的需要修改此 class,但这是一个很好的起点。

更新:如果您出于任何原因想要使用当前代码,请将鼠标侦听器更改为焦点侦听器并覆盖 focusGained。