重点关注并关注失去的Java

时间:2013-06-05 18:46:42

标签: java

我的表单上有一些文本字段。我喜欢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个文本字段的问题处理。有什么方法可以简化吗? 感谢。

4 个答案:

答案 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的分离事件处理程序类,然后覆盖focusGainedfocusLost方法。像这样:

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));

                }
        }
    });