Автоматический выбор первого элемента ListView в JavaFX - PullRequest
0 голосов
/ 22 ноября 2018

Я создал 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();
}

Ответы [ 2 ]

0 голосов
/ 26 июля 2019

Вы можете использовать getSelectionModel().select(0) Но вы должны убедиться, что используете его сразу после добавления элементов в список.

0 голосов
/ 22 ноября 2018

Вы читаете, используя listView.getSelectionModel().select(newEmail) - это тот же метод, который вы использовали бы, чтобы делать то, что вы хотите.Просто вызовите это после инициализации списка элементов и замените newEmail на индекс первого элемента, который равен 0.

listView.setItems(model.getEmailList());

// assuming the list is never null
if (!listView.getItems().isEmpty()) {
    listView.getSelectionModel().select(0);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...