Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将SWT控件引用传递给枚举 我的设置_Java_Enums_Eclipse Rcp_Object Reference - Fatal编程技术网

Java 将SWT控件引用传递给枚举 我的设置

Java 将SWT控件引用传递给枚举 我的设置,java,enums,eclipse-rcp,object-reference,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);

我在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);
我正在尝试为以下每个文本对象设置枚举常量的专用控制字段:

在枚举中,我只为控制字段提供了一个简单的getter/setter

我有一个在用户按下按钮时调用的方法。此方法循环遍历枚举常量,并将某些树元素的文本设置为控件对象中的任何内容:

编辑-某些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方法,以便我可以轻松地迭代它们,并为Msg对象获取/设置字段。这很好,虽然您可以建议一个更好的替代方案,但问题在于添加了我提到的控制字段。

很难说清楚,但这可能是一个并发问题,因为您似乎正在使用一个有状态的enum MessageField,或者它是MsgField?,这是一个,因为枚举本质上是全局变量。嗯,你可能是对的。该应用程序允许用户通过填写文本和组合字段来填充对象,然后将对象序列化为JSON文件。每个枚举常量表示上述对象中的一个字段,这简化了我程序中的许多操作。我试图通过将每个字段的文本和组合输入与它们映射到的枚举常量相关联来进一步简化它。另一种选择是什么?enum起初相当简单,但现在添加它似乎做得太多了。我是否应该创建一个映射到我正试图序列化的对象的类而不是枚举?枚举非常有用,但您需要在编译时了解它们的状态。如果您添加更多的代码,可能会更容易给出建议。只需为MsgField添加一些代码,谢谢您的帮助!
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());
        }
    }
}
root.getItem(1).getItem(0).setText(textSendTime.getText());
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();
        }
    };
}