Как использовать автоматическое связывание текста с флажком SWT кнопки - PullRequest
2 голосов
/ 30 ноября 2011

Я использую инфраструктуру привязки данных JFace для связи выбора флажка с моделью:

final DataBindingContext ctx = new DataBindingContext();
final Realm realm = ctx.getValidationRealm();
final IViewerObservableValue selection = ViewersObservables.observeSingleSelection(viewer);
final IObservableValue selectionObservable = BeansObservables.observeDetailValue(realm, selection, "isSelected", boolean.class);
final UpdateValueStrategy strategy = new UpdateValueStrategy(true, UpdateValueStrategy.POLICY_UPDATE);
ctx.bindValue(SWTObservables.observeSelection(button), selectionObservable, strategy, strategy);

В презентации необходимо использовать текст флажка для отображения конкретной информации о текущем выборе, но использование невозможно observeText(Control):

final UpdateValueStrategy update = new UpdateValueStrategy(true, UpdateValueStrategy.POLICY_NEVER);
ctx.bindValue(SWTObservables.observeText(button), textObservable, null, update);

Это вызывает исключение SWTE:

Не удалось создать представление: виджет [org.eclipse.swt.widgets.Button] не поддерживается.

Есть ли способ сделать привязку текста на кнопке SWT?

РЕДАКТИРОВАТЬ

Быстрое решение заключается в установке метки рядом с флажком,тогда связывание может быть легко выполнено с помощью SWTObservables.observeText(label)

SOLUTION

. Оно работает в Eclipse 3.7

.

1 Ответ

0 голосов
/ 25 января 2014

OK.Из того, что я понимаю, пользователь выбирает кнопку, выбор переносится в модель, а затем вы хотите, чтобы кнопка показывала какой-то новый текст.Если это так, вот решение:

DataBindingContext dbc = getBindingContext();
org.eclipse.swt.widgets.Button b = null; // New with the proper flag for CHECK
Object theModelBean = null;  // Initialize as you wish

Теперь вам нужны ДВЕ привязки.Первое связывание, привязывает выделение к логическому значению в модели:

ISWTObservableValue targetBool = WidgetProperties.selection().observe(b);
IObservableValue modelBool = BeanProperties.value("someBooleanField").observe(theModelBean);
dbc.bindValue(targetBool, modelBool);

Теперь, когда выделение происходит, метод setSomeBooleanField вызывается для объекта модели.Чтобы также изменить текст кнопки, этот установщик ДОЛЖЕН вызвать другого установщика в вашей модели объекта, установив новый «текст», который вы хотите отобразить.Этот второй установщик запускает событие изменения свойства, которое, в свою очередь, пробуждает вашу вторую привязку:

IObservableValue targetText = BeanProperties.value("text").observe(b);
IObservableValue modelText = BeanProperties.value("theTextInTheBean").observe(theModelBean);
dbc.bindValue(targetText, modelText);

Эта привязка будет работать только от модели к цели, поэтому вы можете установить политику thje targetToModel в НИКОГДА.

Видите ли, текстовое поле кнопки не поддерживается ViewerProperties, но поддерживается WidgetProperties, а также классом BeanProperties.Вы можете связать почти все с BeanProperties, пока установщик запускает событие изменения свойства.

Установщики в модели должны быть такими:

public void setSomeBooleanField(boolean b){
    firePropertyChange("someBooleanField", this.someBooleanField, this.someBooleanField = b);
    // Form the new Text
    this.setNewText(newText);
}

public void setNewText(String newText){
    firePropertyChange("newText", this.newText, this.newText = newText); // Wake up the second Binding
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...