从 Java 中的多个 JTextFields 中单击鼠标清除文本
Clearing text on mouse click from multiple JTextFields in Java
我正在用两个 JTextField
进行一些错误检查。我将它们标记为 jtext1
和 jtext2
。
现在我的 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。
我正在用两个 JTextField
进行一些错误检查。我将它们标记为 jtext1
和 jtext2
。
现在我的 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。