javafx listview нулевой указатель при выборе элемента - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь выполнить действие при выборе элемента из представления списка (в настоящее время у меня работает comboBox, но я бы хотел изменить его на listView или любой другой тип, который может отображать выбираемые элементы вформа списка, если у вас есть идеи различных элементов управления, я открыт для идей)

В любом случае, у меня есть listView с методом изменения свойства, чтобы выполнить определенное действие при выборе элемента изсписок.У меня также есть другой метод, который обновил список.Когда я нажимаю кнопку обновления и пытаюсь выбрать элемент из списка, я получаю нулевой указатель на lw.getSelectionModel (). GetSelectedItem ().Я пытался противостоять этому, делая заявление, не работает.

public void initialize(URL arg0, ResourceBundle arg1)  {
    if(arr != null || arr.length > 0) {
        for(int i = 0; i<arr.length; i++) {
            cmBox.getItems().add(arr[i]);
            lw.getItems().add(arr[i]);
        }
    }

    lw.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {

        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            if(lw.getSelectionModel().getSelectedItem() == null) {
                lw.getSelectionModel().selectFirst();
            }
            String selectedString = lw.getSelectionModel().getSelectedItem();
            String[] conParts = selectedString.split("@");
            String selectedConName = conParts[0];
            number = conParts[1];
            selectedName = selectedConName;
            displayTF(selectedName);
        }
    });
}

для сравнения, этот метод работает с comboBox:

public void pickContact(ActionEvent event) {
    if(cmBox.getSelectionModel().getSelectedIndex() == -1) {
        return;
    }
    String selectedString = arr[cmBox.getSelectionModel().getSelectedIndex()];
    String[] conParts = selectedString.split("@");
    String selectedConName = conParts[0];
    number = conParts[1];
    selectedName = selectedConName;
    displayTF(selectedName);
}

Кроме того, это метод обновления:

public void reloadCmBox(ActionEvent event) {
    cmBox.getItems().clear();
    arr = sqld.selectAll();
    cmBox.setItems(FXCollections.observableArrayList(Arrays.asList(arr)));
    cmBox.getSelectionModel().selectFirst();

    lw.getItems().clear();
    lw.setItems(FXCollections.observableArrayList(Arrays.asList(arr)));
    cmBox.getSelectionModel().selectFirst();
}

Если выИнтересно, это файл fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ComboBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>

<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="409.0" prefWidth="535.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.CVController">
   <children>
      <TextField fx:id="tf" layoutX="325.0" layoutY="75.0" />
      <Button layoutX="325.0" layoutY="141.0" mnemonicParsing="false" onAction="#placeCall" text="Call" />
      <Button fx:id="sendText" layoutX="367.0" layoutY="141.0" mnemonicParsing="false" onAction="#sendText" text="Text" />
      <Button fx:id="OpenConEditor" layoutX="412.0" layoutY="141.0" mnemonicParsing="false" onAction="#openConEditer" text="Edit" />
      <Button layoutX="458.0" layoutY="141.0" mnemonicParsing="false" onAction="#deleteCon" text="Delete" />
      <Button fx:id="OpenConCreator" layoutX="483.0" layoutY="75.0" mnemonicParsing="false" onAction="#openConAdder" text="New" />
      <ComboBox fx:id="cmBox" layoutX="93.0" layoutY="74.0" onAction="#pickContact" prefHeight="28.0" prefWidth="223.0" />
      <Label layoutX="231.0" layoutY="20.0" prefHeight="28.0" prefWidth="149.0" text="Contacts View">
         <font>
            <Font size="20.0" />
         </font>
      </Label>
      <Button fx:id="SDTomer" layoutX="77.0" layoutY="162.0" mnemonicParsing="false" onAction="#speedDial" text="Tomer" />
      <Label layoutX="77.0" layoutY="133.0" text="Speed Dial">
         <font>
            <Font size="16.0" />
         </font>
      </Label>
      <Button layoutX="46.0" layoutY="75.0" mnemonicParsing="false" onAction="#reloadCmBox" text="R" />
      <ListView fx:id="lw" layoutX="153.0" layoutY="187.0" prefHeight="200.0" prefWidth="200.0" />
   </children>
</AnchorPane>

1 Ответ

0 голосов
/ 15 февраля 2019

Прежде всего, вам следует избегать действий, которые изменяют свойство слушателя этого свойства.Вызов selectFirst является такой вещью.

Также обратите внимание, что выбранный элемент может быть изменен на null, если выбранный элемент удаляется из списка items.Не может быть элемента для выбора во время вызова слушателя.Лучше всего было бы просто игнорировать подобные события (или хотя бы использовать Platform.runLater после проверки непустого списка элементов для выбора элемента).

Вы можете использовать newValue дляполучите обновленное значение свойства, которое вы слушаете, кстати.

lw.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {

    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
        if(newValue != null) {
            String[] conParts = newValue.split("@");
            String selectedConName = conParts[0];
            number = conParts[1];
            selectedName = selectedConName;
            displayTF(selectedName);
        }

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...