我的表单上有一些文本字段。我喜欢 focusGained 和 focusLost 事件。使用 2 或 3 个文本字段执行此操作很容易。但是,在 18 个文本字段之后,嗯,有点令人困惑。 有没有办法缩短 focusGained 和 focusLost 事件? 示例:
txtSomeTextFocusGained(java.awt.event FocusEvent evt){
if(txtSomeText.getText().equals("Text here!"){
txtSomeText.setText("");
}
}
txtSomeTextFocusLost(java.awt.event FocusEvent evt){
if(txtSomeText.getText().equals(""){
txtSomeText.setText("Text here!");
}
}
这是一个文本字段,我在处理大约 18 个文本字段时遇到问题。有什么办法可以简化吗? 谢谢。
最佳答案
这些方法足够简单,所以我想不出进一步简化它们的方法。不过,您可以做的是通过声明一个 FocusListener 实例来防止代码重复,然后使用 addFocusListener(...)
将其添加到<强>所有文本字段。
它看起来像这样:
// Instantiate a FocusListener ONCE
java.awt.event.FocusListener myFocusListener = new java.awt.event.FocusListener() {
public void focusGained(java.awt.event.FocusEvent focusEvent) {
try {
JTextField src = (JTextField)focusEvent.getSource();
if (src.getText().equals("Text here!") {
src.setText("");
}
} catch (ClassCastException ignored) {
/* I only listen to JTextFields */
}
}
public void focusLost(java.awt.event.FocusEvent focusEvent) {
try {
JTextField src = (JTextField)focusEvent.getSource();
if (src.getText().equals("") {
src.setText("Text here!");
}
} catch (ClassCastException ignored) {
/* I only listen to JTextFields */
}
}
};
(如果您绝对确定事件源始终是 JTextField,则可以省略 try-catch
block ,但这始终是一个不好的做法依赖这样的假设。)
然后,对于每个 JTextField,您只需添加相同 FocusListener:
...
someTextField.addFocusListener(myFocusListener);
...
(只有半行 - 很难比这更短了。)
另一种选择是子类化 JTextField,在构造函数中添加 FocusListener,但我没有看到比第一个解决方案有任何优势(除非您想要更灵活/更强大的解决方案,例如每个 JTextField 等有不同的文本)。
关于java - Java 获得焦点和失去焦点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16947532/