我的表单上有一些文本字段。我喜欢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
块,但是依赖于此类假设始终是一种不好的做法。)然后,对于每个JTextField,您只需要添加相同的FocusListener:
...
someTextField.addFocusListener(myFocusListener);
...
(只有半条线,很难做到比这短的线。)
另一种选择是将JTextField子类化,在构造函数中添加一个FocusListener,但是我看不出第一个解决方案没有任何优势(除非您想要一个更灵活/强大的解决方案,例如,每个JTextField都使用不同的文本等)。