将多个文本字段添加到单个焦点侦听器

adding multiple textfields to a single focus listener

我正在尝试将多个文本字段添加到要执行的单个焦点侦听器中,目前我已经添加了一个文本字段,但我不知道如何向其中添加多个文本字段,

这样的事情怎么样?

FocusListener clearFields = new FocusListener() {
public void focusGained(FocusEvent e) 
{
   JT_id.setText("");
   JT_name.setText("");
   JT_add.setText("");
   JT_cno.setText("");
   JT_email.setText("");
}

public void focusLost(FocusEvent e)
{
  // nothing
}
});

JT_id.addFocusListener(clearFields);
JT_name.addFocusListener(clearFields);
JT_add.addFocusListener(clearFields);
JT_cno.addFocusListener(clearFields);
JT_email.addFocusListener(clearFields)

您仍然需要为所有 text-fields 添加一个焦点侦听器,以避免第一个 (JT_id) 上的 clicking/focusing 将清除所有它们的情况clicking/focusing对其他人什么都不做。

或者,您知道,替代方案 - 为每个文本字段分配一个仅清除该字段的焦点监听器。

i think its way better than creating a focus listener for each textfield.

通常答案是:"it depends..."

但在你的情况下我会说:每个文本字段都应该有自己的监听器(实例)。 原因是您更改了文本字段的内容。 当您仅在一个 Listener 实例中执行此操作时,无论哪个文本字段受到影响,您都可以在事件发生时随时更改所有文本字段,或者最终得到需要新条目的 if/else 级联如果您添加另一个文本字段。

我建议您为 Listener 创建一个命名的内部 class,给它一个文本字段作为参数:

class MyTextFiledFocusListener implements FocusListener {
  private final JTextFiled textField;
  MyTextFiledFocusListener(JTextFiled textField){
    this.textField = textField;
    textField.addFocusListener(this);
  }
  public void focusGained(FocusEvent e) 
  {
    textField.setText("");
  }

  public void focusLost(FocusEvent e)
  {
    // nothing
  }
}

您发布的内容更改为:

new MyTextFiledFocusListener(JT_id);

仅作记录:

很多与 Swing 相关的具有多个方法的接口都有带空方法的默认实现(java8 前 java8 解决方案 默认方法 )也是如此 FocusListener.这些默认实现通常称为*Adapter。因此,当您扩展 FocusAdapter 而不是实施 FocusListener:

时,您可以缩短代码
class MyTextFiledFocusListener extends FocusAdapter {
  private final JTextFiled textField;
  MyTextFiledFocusListener(JTextFiled textField){
    this.textField = textField;
    textField.addFocusListener(this);
  }
  public void focusGained(FocusEvent e) 
  {
    textField.setText("");
  }
}