将SWT控制参考传递给枚举

时间:2015-10-10 00:58:20

标签: java enums eclipse-rcp object-reference

我的设置

我在Eclipse RCP应用程序中有一些看起来像这样的代码(它在部件的@PostConstruct方法中):

scroll = new ScrolledComposite(parent, SWT.V_SCROLL | SWT.H_SCROLL | SWT.BORDER);
taskingInputsGroup = new Composite(scroll, SWT.NONE);

textSendTime = new Text(taskingInputsGroup, SWT.BORDER);
textSubject = new Text(taskingInputsGroup, SWT.BORDER);
textTaskStartTime = new Text(taskingInputsGroup, SWT.BORDER);

我正在尝试为每个private Control对象设置Enum常量的Text字段:

textSendTime = new Text(taskingInputsGroup, SWT.BORDER);  
MsgField.SEND_TIME.setControl(textSendTime); 

在Enum中,我只为Control字段设置了一个简单的getter / setter。

我有一个用户按下Button时调用的方法。此方法循环遍历Enum常量,并将某些TreeItem的文本设置为Control对象中的任何内容:

MsgField[] msgFields= MsgField.values();
for (int i = 0; i < msgFields.length; i++) {
    Control control = msgFields[i].getControl();
    if (control != null) {
        if (control instanceof Text) {
            root.getItem(i).getItem(0).setText(((Text)control).getText());
        }
    }
}

我的问题

即使((Text)control).getText()字段中有文字,我也会从Text收到空文字。为什么会这样?我知道我忽略了一些简单的事情(这是漫长的一天)。我已经阅读了一些关于Java传递值的SO帖子,但我似乎无法应用这个问题的答案。如果我直接在视图类中的对象上调用getText(),这可以正常工作:

root.getItem(1).getItem(0).setText(textSendTime.getText());

编辑 - 一些MsgField枚举代码:

public enum MsgField {

    private boolean isRequiredField;
    private String treeName;

    public abstract void setValue(Msg msg, String value);
    public abstract Object getValue(Msg msg);

    private MsgField(boolean req, String name) {
        isRequiredField = req;
        treeName = name;
    }

    SEND_TIME("Send Time", true) {
        @Override
        public void setValue(Msg msg, String value) {
            msg.setSendTime(value);
        }
        @Override
        public Object getValue(Msg msg) {
            return msg.getSendTime();
        }
    },

    // ....
    // other fields
    // ....

    START_TIME("Start Time", false) {
        @Override
        public void setValue(Msg msg, String value) {
            msg.setStartTime(value);
        }
        @Override
        public Object getValue(Msg msg) {
            return msg.getStartTime();
        }
    };
}

所以这里的想法是表示Msg类的字段,并为每个字段设置这些get / set方法,以便我可以轻松地迭代它们并获取/设置{{1}的字段对象。这很好(虽然也许你可以建议一个更好的选择),但问题来自于我提到的Msg字段的添加。

0 个答案:

没有答案