FXML:绑定到控制器
FXML: Binding to controller
是否可以像 xaml 一样在 FXML 中将控制器绑定到 class 变量。我正在做的是:
FXML
<ComboBox fx:id="searchField"
HBox.hgrow="ALWAYS" editable="true" />
<GridPane hgap="5" vgap="5">
<Label text="Nom" />
<Label text="$selecteClient.name"
GridPane.columnIndex="1" />
<Label GridPane.rowIndex="1" text="tél" />
<Label text="$electedClient.phoneNumber"
GridPane.rowIndex="1" GridPane.columnIndex="1" />
<GridPane/>
控制器:
private final List<Client> clients = FXCollections.observableArrayList(ImportingDataService.importClients());
@FXML
private Client selectedClient;
@FXML
private ComboBox<Client> searchField;
@Override
public void initialize(URL location, ResourceBundle resources) {
// Set appDtat client id so it refreshes when client is changed
this.appState.clientViewClientIDProperty().addListener((obs, oldValue, newValue) -> {
selectedClient = ImportingDataService.importClient(newValue.longValue());
});
// Set up combo box
setUpComboBox();
}
private void setUpComboBox() {
searchField.getItems().addAll(clients);
UtilService.autoCompleteComboBoxPlus(searchField, (typedText, client) -> client.getName().contains(typedText));
// Handle selecting clients
searchField.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
selectedClient = ImportingDataService.importClient(newValue.getId());
});
}
我的 Client
class 是一个具有 String
字段 name
和 phoneNumber
的 class。 ImportingDataService.importClient
用于从数据库导入数据,它们工作得很好(我放置了断点并进行了检查)。问题是我不知道为什么当我更改 ComboBox
的选择时客户端 Label
不更新,而 selectedClient
确实发生了变化。我究竟做错了什么?
这有多种原因:
- 一个简单的场是不可观察的。
- 您没有在表达式绑定中包含
controller
。
- 此处
$selecteClient.name
和此处 $electedClient.phoneNumber
有错字。
- 整个表达式需要包裹在
{}
中才能绑定,而不仅仅是设置。
你可以,例如像这样修复它:
控制器
private final ObjectProperty<Client> selectedClient = new SimpleObjectProperty<>(initialClient);
public final Client getSelectedClient() {
return this.selectedClient.get();
}
public final void setSelectedClient(Client value) {
this.selectedClient.set(value);
}
public final ObjectProperty<Client> selectedClientProperty() {
return this.selectedClient;
}
...
// selectedClient = ImportingDataService.importClient(newValue.getId());
setSelectedClient(ImportingDataService.importClient(newValue.getId()));
fxml
<ComboBox fx:id="searchField"
HBox.hgrow="ALWAYS" editable="true" />
<GridPane hgap="5" vgap="5">
<Label text="Nom" />
<Label text="${controller.selectedClient.name}"
GridPane.columnIndex="1" />
<Label GridPane.rowIndex="1" text="tél" />
<Label text="${controller.selectedClient.phoneNumber}"
GridPane.rowIndex="1" GridPane.columnIndex="1" />
<GridPane/>
客户端
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
(或类似的东西)
是否可以像 xaml 一样在 FXML 中将控制器绑定到 class 变量。我正在做的是:
FXML
<ComboBox fx:id="searchField"
HBox.hgrow="ALWAYS" editable="true" />
<GridPane hgap="5" vgap="5">
<Label text="Nom" />
<Label text="$selecteClient.name"
GridPane.columnIndex="1" />
<Label GridPane.rowIndex="1" text="tél" />
<Label text="$electedClient.phoneNumber"
GridPane.rowIndex="1" GridPane.columnIndex="1" />
<GridPane/>
控制器:
private final List<Client> clients = FXCollections.observableArrayList(ImportingDataService.importClients());
@FXML
private Client selectedClient;
@FXML
private ComboBox<Client> searchField;
@Override
public void initialize(URL location, ResourceBundle resources) {
// Set appDtat client id so it refreshes when client is changed
this.appState.clientViewClientIDProperty().addListener((obs, oldValue, newValue) -> {
selectedClient = ImportingDataService.importClient(newValue.longValue());
});
// Set up combo box
setUpComboBox();
}
private void setUpComboBox() {
searchField.getItems().addAll(clients);
UtilService.autoCompleteComboBoxPlus(searchField, (typedText, client) -> client.getName().contains(typedText));
// Handle selecting clients
searchField.getSelectionModel().selectedItemProperty().addListener((obs, oldValue, newValue) -> {
selectedClient = ImportingDataService.importClient(newValue.getId());
});
}
我的 Client
class 是一个具有 String
字段 name
和 phoneNumber
的 class。 ImportingDataService.importClient
用于从数据库导入数据,它们工作得很好(我放置了断点并进行了检查)。问题是我不知道为什么当我更改 ComboBox
的选择时客户端 Label
不更新,而 selectedClient
确实发生了变化。我究竟做错了什么?
这有多种原因:
- 一个简单的场是不可观察的。
- 您没有在表达式绑定中包含
controller
。 - 此处
$selecteClient.name
和此处$electedClient.phoneNumber
有错字。 - 整个表达式需要包裹在
{}
中才能绑定,而不仅仅是设置。
你可以,例如像这样修复它:
控制器
private final ObjectProperty<Client> selectedClient = new SimpleObjectProperty<>(initialClient);
public final Client getSelectedClient() {
return this.selectedClient.get();
}
public final void setSelectedClient(Client value) {
this.selectedClient.set(value);
}
public final ObjectProperty<Client> selectedClientProperty() {
return this.selectedClient;
}
...
// selectedClient = ImportingDataService.importClient(newValue.getId());
setSelectedClient(ImportingDataService.importClient(newValue.getId()));
fxml
<ComboBox fx:id="searchField"
HBox.hgrow="ALWAYS" editable="true" />
<GridPane hgap="5" vgap="5">
<Label text="Nom" />
<Label text="${controller.selectedClient.name}"
GridPane.columnIndex="1" />
<Label GridPane.rowIndex="1" text="tél" />
<Label text="${controller.selectedClient.phoneNumber}"
GridPane.rowIndex="1" GridPane.columnIndex="1" />
<GridPane/>
客户端
public String getName() {
return name;
}
public String getPhoneNumber() {
return phoneNumber;
}
(或类似的东西)