如何在Java Swing中为多个文本字段创建一个事件监听器?

时间:2015-09-22 16:52:12

标签: java swing swt

我有一个包含多个Text Widgets的shell。

每个对应一个不同的String对象,该对象保存其输入以供以后处理(在放置小部件本身之后)。

每次文本更改时,我都会使用ModifyListener更新字符串,如下例所示:

    String clientNametext = "";
    Text clientName = new Text(composite, SWT.BORDER);
    clientName.addModifyListener(new ModifyListener() {

        @Override
        public void modifyText(ModifyEvent paramModifyEvent)
        {
            clientNametext = clientName.getText();

        }
    });

但是,我有很多这样的Text字段,我想清理代码,而不是每个字段附加一个新的内部类监听器 - 创建一个ModifyListener,然后附加到所有这些变量,并根据触发事件的字段更改修改正确的变量。

问题是,ModifyEvent本身似乎不包含此类信息,或以任何方式唯一标识哪个文本字段已更改。

编辑:对我来说,如果可能的话,只有一个处理所有案例的监听器非常重要。

欢迎使用“使用其他类型的字段和侦听对象”的答案,以防ModifyEvent无法唯一地标识出现它的确切窗口小部件,而不使用映射对象ID或其他什么的疯狂逻辑。

1 个答案:

答案 0 :(得分:3)

将整个行为包装在一个类中。

现在你有一堆StringText个对象。将它们全部归为一类:

public class ListeningText {
  private String clientNametext = "";
  private final Text clientName = new Text(composite, SWT.BORDER);

  public ListeningText() {
    clientName.addModifyListener(new ModifyListener() {
      @Override
      public void modifyText(ModifyEvent paramModifyEvent)
      {
        clientNametext = clientName.getText();
      }
    });
  }

  public Text getText() {
    return Text;
  }

  public String getValue() {
    return value;
  }
}

然后,像这样使用它。您只需创建一个字段项ListeningText,而不是StringText。你可以这样使用它:

public class YourComponent {
  ListeningText text;
  ListeningText anotherText;
  // etc.

  public void initComponents() {
    // add them like this:
    text = new ListeningText();
    container.add(text.getComponent());
  }

  public void doSomething() {
    // get the value like this:
    System.out.println(text.getValue()); // or whatever
  }
}

请注意,此解决方案并未创建单个" ModifyListener,但我认为你想要的是prevent code duplication,你不在乎还有很多这样的对象。只有一个对象,然后编写它来更新相应的字段会困难得多;这种方式应该在没有真正复杂的代码的情况下完成干净的代码目标。