当我过去需要这个时,我已经创建了我想添加“自动清除”功能的组件的子类。例如:
public class AutoClearingTextField extends JTextField {
final FocusListener AUTO_CLEARING_LISTENER = new FocusListener(){
@Override
public void focusLost(FocusEvent e) {
//onFocusLost(e);
}
@Override
public void focusGained(FocusEvent e) {
selectAll();
}
};
public AutoClearingTextField(String string) {
super(string);
addListener();
}
private void addListener() {
addFocusListener(AUTO_CLEARING_LISTENER);
}
}
最大的问题是我还没有找到一种“好”的方法来获取所有标准构造函数而不编写覆盖。添加它们并强制调用 addListener 是我发现的最通用的方法。
另一种选择是使用 ContainerListeer 监视顶级容器上的 ContainerEvents 以检测新小部件的存在,并根据已添加的小部件添加相应的焦点侦听器。 (例如:如果容器事件是由添加TextField引起的,那么添加一个焦点监听器,它知道如何选择TextField中的所有文本,等等。)如果添加了Container,那么就需要递归添加ContainerListener到那个新的子容器。
无论哪种方式,您都无需在实际的 UI 代码中处理焦点侦听器——这一切都将在更高的层次上得到处理。