java - 在 JavaFX 中自动选择 ListView 的第一项
问题描述
我创建了一个 ListView,但是当我打开它时,没有选择任何元素。如何自动选择加载的第一个项目?我问这个是因为我正在尝试创建一个电子邮件客户端,并且我需要在用户打开程序时必须自动加载第一封电子邮件的信息。这是我的代码:
public class ListController {
@FXML
private ListView<Email> listView;
private DataModel model;
public void initModel(DataModel model) {
if (this.model != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.model = model;
model.loadData(null);
listView.setItems(model.getEmailList());
listView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection)
-> model.setCurrentEmail(newSelection));
model.currentEmailProperty().addListener((obs, oldEmail, newEmail) -> {
if (newEmail == null) {
listView.getSelectionModel().clearSelection();
} else {
listView.getSelectionModel().select(newEmail);
}
});
listView.setCellFactory(lv -> new ListCell<Email>() {
@Override
public void updateItem(Email mail, boolean empty) {
super.updateItem(mail, empty);
if (empty) {
setText(null);
} else {
setText(mail.getMittente());
}
}
});
}
编辑:@Gnas 这是我现在的代码,但它仍然不起作用:
public class ListController {
@FXML
private ListView<Email> listView;
private DataModel model;
public void initModel(DataModel model) {
if (this.model != null) {
throw new IllegalStateException("Model can only be initialized once");
}
this.model = model;
model.loadData(null);
listView.setItems(model.getEmailList());
if (!listView.getItems().isEmpty()) {
listView.getSelectionModel().select(0);
}
listView.setCellFactory(lv -> new ListCell<Email>() {
@Override
public void updateItem(Email mail, boolean empty) {
super.updateItem(mail, empty);
if (empty) {
setText(null);
} else {
setText(mail.getMittente());
}
}
});
}
编辑2:
public void start(Stage stage) throws Exception {
FXMLLoader listLoader = new FXMLLoader(getClass().getResource("lista.fxml"));
FXMLLoader menuLoader = new FXMLLoader(getClass().getResource("menubar.fxml"));
FXMLLoader textareaLoader = new FXMLLoader(getClass().getResource("textarea.fxml"));
FXMLLoader fieldLoader = new FXMLLoader(getClass().getResource("textfield.fxml"));
FXMLLoader buttonLoader = new FXMLLoader(getClass().getResource("button.fxml"));
AnchorPane root = new AnchorPane(listLoader.load(), textareaLoader.load(), fieldLoader.load(), menuLoader.load(), buttonLoader.load());
ListController listController = listLoader.getController();
MenuBarController menuController = menuLoader.getController();
TextAreaController textareaController = textareaLoader.getController();
TextFieldController fieldController = fieldLoader.getController();
ButtonController buttonController = buttonLoader.getController();
DataModel model = new DataModel();
listController.initModel(model);
menuController.initModel(model);
textareaController.initModel(model);
fieldController.initModel(model);
buttonController.initModel(model);
Scene scene = new Scene(root, 603, 403);
stage.setScene(scene);
stage.show();
}
解决方案
您正在使用listView.getSelectionModel().select(newEmail)
which 与您将用来做您想做的事情的方法相同。只需在初始化项目列表并替换newEmail
为第一个项目的索引后调用它,即 0。
listView.setItems(model.getEmailList());
// assuming the list is never null
if (!listView.getItems().isEmpty()) {
listView.getSelectionModel().select(0);
}
推荐阅读
- javascript - 禁用按钮在 if-else 中不起作用,但在没有 if-else 的情况下起作用
- ansible - 尝试将“命令:sudo ...”更改为具有成为的模块时出现 Ansible 错误
- powerbi - Power BI:返回两个日期之间每个交易对手及其几种货币的数值数据总和及其变化
- r - 使本地数据集可全局访问
- json - Elm:解析嵌套的 json
- c# - .NET C# 中对象或其属性的确定性 UUID / 哈希
- pdf - 如何提取页面的一部分并在itext7中写入新的PDF文件?
- javascript - 排列:推送功能不起作用,JavaScript O(n*n!) 运行时
- python - 为什么密集层的形状是(无,50176)?
- zustand - Zusand 错误:无效的挂钩调用。Hooks 只能在函数组件的主体内部调用