我的表单上有一些文本字段。我喜欢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个文本字段的问题处理。有什么方法可以简化吗? 感谢。
答案 0 :(得分:3)
方法很简单,所以我想不出一种简化它们的方法。但是,您可以做的是通过声明一个 FocusListener实例,然后使用addFocusListener(...)
将其添加到所有文本来阻止代码重复-fields。
它看起来像这样:
// 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的不同文本等)。
答案 1 :(得分:1)
如果您只想在聚焦的字段中设置一些文本,您可以编写实现FocusListener
的分离事件处理程序类,然后覆盖focusGained
和focusLost
方法。像这样:
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import javax.swing.JTextField;
public class CustomFocusListener implements FocusListener {
JTextField txt;
String textWhenFocusGained;
String textWhenFocusLost;
public CustomFocusListener(JTextField txt, String textWhenFocusGained,
String textWhenFocusLost) {
this.txt = txt;
this.textWhenFocusGained = textWhenFocusGained;
this.textWhenFocusLost = textWhenFocusLost;
}
@Override
public void focusGained(FocusEvent arg0) {
txt.setText(textWhenFocusGained);
}
@Override
public void focusLost(FocusEvent arg0) {
txt.setText(textWhenFocusLost);
}
}
答案 2 :(得分:0)
使用此功能。
if(txtSomeText.getText().equals("Text here!")){
txtSomeText.setText("");
答案 3 :(得分:0)
/////////////// It's problem of lower and supper case you should make ur text in lower case in code. and for desing of jtextfield it's ok
txtIdDeVoyageur = new JTextField();
txtIdDeVoyageur.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent e) {
if(txtIdDeVoyageur.getText().trim().toLowerCase().equals("id de voyageur")){
txtIdDeVoyageur.setText("");
txtIdDeVoyageur.setForeground(Color.black);
}
}
@Override
public void focusLost(FocusEvent e) {
if (txtIdDeVoyageur.getText().trim().equals("") ||
txtIdDeVoyageur.getText().trim().toLowerCase().equals("id de voyageur"))
{
txtIdDeVoyageur.setText("id de voyageur");
txtIdDeVoyageur.setForeground(new Color (153,153,153));
}
}
});