首页 > 解决方案 > 在 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();
}

标签: javalistviewjavafx

解决方案


您正在使用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);
}

推荐阅读