Статьи

Привязка к последовательности в скомпилированном скрипте JavaFX

Команда JavaFX Script Compiler недавно добилась больших успехов в области связывания последовательностей. Для получения дополнительной информации о последовательностях см. Статью «Получение Плутона» . Вот пример привязки ListBox к последовательности, чтобы при изменении последовательности ListBox оставался синхронизированным с элементами в последовательности. Скомпилируйте и запустите этот пример, щелкнув слова в ListBox и введя слово, а затем активировав кнопку Добавить . Я закончу с кратким обсуждением обязательных аспектов этого примера.

Bindingtoasequence_2

/*
* ListBoxSequenceBinding.fx
*
* Developed 2008 by James L. Weaver (jim.weaver at lat-inc.com)
* to serve as a JavaFX Script example of binding a ListBox to
* a sequence.
*/
import javafx.ui.*;
import java.lang.System;

class Model {
attribute entries:String[] = ["Red", "Green", "Blue", "Yellow", "Purple"];
attribute selectedIndex:Number = 0 on replace {
System.out.println("selectedIndex={selectedIndex}");
};
attribute entryToAdd:String;
}

Frame {
var mdl = Model {}
title: "Binding to a Sequence"
width: 300
height: 200
background: Color.WHITE
visible: true
content:
BorderPanel {
center:
FlowPanel {
content:
ListBox {
cells: bind for (entry in mdl.entries)
ListCell {
text: entry
}
selection: bind mdl.selectedIndex with inverse
fixedCellWidth: 100
visibleRowCount: 4
}
}
bottom:
FlowPanel {
content: [
TextField {
value: bind mdl.entryToAdd with inverse
columns: 10
},
Button {
text: "Add"
defaultButton: true
enabled: bind mdl.entryToAdd.trim() <> ""
action:
function():Void {
insert mdl.entryToAdd into mdl.entries;
mdl.entryToAdd = "";
System.out.println("sizeof entries={sizeof mdl.entries}");
}
}
]
}
}
}

Обязательные аспекты этой программы

Основная цель этого поста — научить вас связывать последовательность, поэтому сначала я укажу на это: как показано в следующем фрагменте программы, cellsатрибут объекта ListBoxсвязан с entriesпоследовательностью, содержащейся в модели:

  cells: bind for (entry in mdl.entries)
ListCell {
text: entry
}

Чтобы выполнить это связывание, мы заручаемся помощью forвыражения, значением которого является последовательность экземпляров ListCell. Каждый из этих экземпляров имеет элемент entriesпоследовательностей, назначенный его textатрибуту. Когда entriesпоследовательность изменяется (например, путем добавления элемента), forвыражение переоценивается, вызывая динамическое обновление ListBox. Чтобы узнать больше о forвыражении, см. Этот пост .

Другое связывание в этой программе поддерживает синхронизацию TextField с entryToAddатрибутом в модели, как показано в этом эксперте:

  TextField {
value: bind mdl.entryToAdd with inverse
columns: 10
},

Это двунаправленное связывание, обозначаемое with inverseключевыми словами. Существует еще один компонент пользовательского интерфейса, который связывается с атрибутом entryToAdd, который вызывает включение кнопки « ОК» только в том случае, если TextFieldсодержит текст:

  Button {
text: "Add"
defaultButton: true
enabled: bind mdl.entryToAdd.trim() <> ""
...code omitted...
}

Наконец, следующая привязка приводит selectedк синхронизации selectedIndexатрибута ListBox с атрибутом модели. Чтобы продемонстрировать это, его значение выводится на консоль в триггере замены, который выполняется при каждом изменении значения.

Как видите, привязка компонентов пользовательского интерфейса к модели является очень мощной концепцией, которая значительно упрощает разработку приложений. Как всегда, пожалуйста, оставьте комментарий, если у вас есть какие-либо вопросы.

С уважением,

Джим Уивер

JavaFX Script: динамические сценарии Java для многофункциональных интернет-приложений и приложений на стороне клиента.

Немедленная загрузка электронных книг (PDF) доступна на
сайте книги Apress.