我有一个包含多个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或其他什么的疯狂逻辑。
答案 0 :(得分:3)
现在你有一堆String
和Text
个对象。将它们全部归为一类:
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
,而不是String
和Text
。你可以这样使用它:
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,你不在乎还有很多这样的对象。只有一个对象,然后编写它来更新相应的字段会困难得多;这种方式应该在没有真正复杂的代码的情况下完成干净的代码目标。