我的表单上有一些文本字段。我喜欢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都使用不同的文本等)。

10-06 10:49