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

3

我有一个带有多个文本小部件的shell。

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

我使用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或其他奇怪的逻辑的情况下唯一地标识发生事件的确切小部件。


Text text = (Text) paramModifyEvent.widget;,然后clientNametext = text.getText();怎么样? - Lukas Rotter
文本不是Swing组件。那么ModifyListener是什么? - FredK
你尝试过实现ActionListener的简单内部类吗? - Yassin Hajaj
@LuxxMiner,我喜欢你的提议。从事件中获取文本作为小部件 - 是否有可能知道它是“clientName”文本而不是“ID 11300的Text实例”? - igorT
1个回答

4

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

当前您有一堆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,但我认为您想要的是防止代码重复,您并不在意仍然有许多这样的对象。只有一个对象,然后将其编写以更新相应的字段将更加困难;这种方式应该能够实现清晰的代码目标,而不需要真正复杂的代码。

谢谢你的回答。 这将使代码更干净,但我认为它仍会为每个文本字段创建一个新的监听器。我想要的是一个监听器来处理所有文本字段,并且该监听器需要根据触发事件知道哪个文本已更改以及需要更新哪个字符串。 - igorT
我只有少数这些文本字段(6个),因此维护一个Map不应该是问题。 整个问题最终归结为“什么将是映射键”,因为事件本身不知道如何告诉我“这次更改的小部件是'clientText1'”。如果Java可以处理多个(6个)创建的侦听器类,那么我想解决方案就像你说的那样,使代码更加美观。但理想情况下,我希望只有一个侦听器。 也许第一次编码会更难,但后来维护起来会更容易。 - igorT
顺便说一下,如果我帮到了你,请不要忘记在问题左侧的投票按钮旁边选择空心复选标记,将此答案标记为正确答案。 - durron597
你提供了很多帮助,但我认为我的问题还没有得到完全的解答。所以我会投票支持,但暂时不打钩。 实际上,我确实想把所有的东西都放在一个地方,只有一个 Listener。 如果这个特定类型的字段和事件无法完成,我愿意使用其他对象。只要事件本身能够告诉我 改变发生的位置 ,这样我就可以在一个地方处理所有情况。 - igorT
@igorT,在modifyText方法中,你可以获取事件的源并检查该源是哪个文本字段。使用大量的if..else语句,你就可以顺利完成了。 - Cristian Marian
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接