【问题标题】:javafx listview null pointer when selecting item选择项目时的javafx listview空指针
【发布时间】:2019-02-14 23:06:01
【问题描述】:

我正在尝试在从列表视图中选择项目时执行一项操作(目前我确实有一个组合框在工作,但我想将其更改为 listView 或任何可以显示可选项目的类型列表的形式,如果您对不同的控件有任何想法,我愿意接受)

无论如何,我有一个带有属性更改方法的 listView,以便在从列表中选择项目时执行特定操作。我还有一种不同的方法来刷新列表。当我单击刷新按钮并尝试从列表中选择一个项目时,我得到一个指向 lw.getSelectionModel().getSelectedItem() 的空指针。我尝试通过执行 if 语句来解决此问题,但不起作用。

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);
        }
    });
}

为了比较,这是与组合框一起使用的方法:

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>

【问题讨论】:

  • a) 为什么不简单地使用“newValue”? b)我不太确定在侦听器中更改该属性的属性是否是个好主意(至少返回 ...)。

标签: java listview javafx combobox


【解决方案1】:

首先,您应该避免将某个属性从侦听器修改为该属性。打电话给selectFirst 就是这样。

另请注意,如果从items 列表中删除选定项目,则可以将选定项目更改为null。在调用侦听器时可能没有要选择的项目。最好的办法可能是简单地忽略这样的事件(或至少在检查非空项目列表以选择元素后使用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);
        }

    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2020-01-30
    • 2018-04-28
    • 2018-09-29
    相关资源
    最近更新 更多