我创建了一个简单的关键字突出显示编辑器,它只包含一个StyledText
小部件:
public class SQLSegmentEditor extends Composite {
private StyledText st;
public SQLSegmentEditor(Composite parent) {
super(parent, SWT.NONE);
this.setLayout(new FillLayout());
st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
st.addLineStyleListener(new SQLSegmentLineStyleListener());
}
}
如何使其可用于数据绑定?我正在寻找合适的方式,而不仅仅是让它发挥作用的方式。
我想观察内部StyledText
的文字内容。
例如:我可以添加一个getStyledText
方法来返回包装的StyledText
小部件,以便在数据绑定中使用它。但这将带来风险。为了保持我的编辑器行为正确,我应该保持StyledText
窗口小部件对客户端代码不可见。
答案 0 :(得分:3)
虽然我不理解你没有将包装好的窗口小部件暴露给客户端的论点,但这是一个可能的解决方案。窗口小部件可以提供WritableValue
,可以通过客户端的数据绑定直接绑定。这意味着绑定超过了3个方:客户端目标,包装可写值和SWT源。唯一的缺点是您在窗口小部件中直接依赖于Databinding。这是一个片段。
import org.eclipse.core.databinding.DataBindingContext;
import org.eclipse.core.databinding.observable.value.WritableValue;
import org.eclipse.jface.databinding.swt.ISWTObservableValue;
import org.eclipse.jface.databinding.swt.WidgetProperties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.StyledText;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Composite;
public class SQLSegmentEditor extends Composite {
private final StyledText st;
private final WritableValue value = new WritableValue();
public SQLSegmentEditor(Composite parent, DataBindingContext ctx) {
super(parent, SWT.NONE);
assert ctx != null;
setLayout(new FillLayout());
st = new StyledText(this, SWT.WRAP | SWT.BORDER | SWT.V_SCROLL);
ISWTObservableValue swtBinding = WidgetProperties.text(SWT.Modify)
.observe(st);
ctx.bindValue(value, swtBinding);
}
public WritableValue getValue() {
return value;
}
}
所以客户端代码看起来像:
DataBindingContext ctx = new DataBindingContext();
SQLSegmentEditor sqlSegmentEditor = new SQLSegmentEditor(getParent(), ctx);
IObservableValue modelObservable = //setup my model-observable
ctx.bindValue(modelObservable, sqlSegmentEditor.getValue());