Метод MultipleSelectionModel getSelectedItems, возвращающий значение Null

Когда я тестировал JavaFx 8 ListView, я столкнулся со странной проблемой. Это код:

Main.java:

package application;

import javafx.application.Application;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;

public class Main extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        Parent root = FXMLLoader.load(getClass().getResource("Test.fxml"));

        Scene scene = new Scene(root);

        stage.setScene(scene);
        stage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
        launch(args);
    }

}

TestController.java:

package application;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener.Change;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;

public class TestController implements Initializable 
{
    @FXML
    ListView<String> listView;

    private ArrayList <String> list;

    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        fillList();
        listView.getSelectionModel().getSelectedItems().addListener(
                (Change<? extends String> change) ->
                {
                    list.clear();

                    ObservableList<String> oList = listView.getSelectionModel().getSelectedItems(); 
                    System.out.println(oList);          
                });
    }

    private void fillList() 
    {
        list = new  ArrayList<>();
        list.add("1.item");
        list.add("2.item");
        list.add("3.item");

        ObservableList<String> items = FXCollections.observableArrayList(list);
        listView.setItems(items);

    }

}

Test.fxml:

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

<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.AnchorPane?>


<AnchorPane id="AnchorPane" prefHeight="399.0" prefWidth="320" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.TestController">
   <children>
      <ListView fx:id="listView" layoutX="14.0" layoutY="85.0" prefHeight="200.0" prefWidth="200.0" />
   </children>
</AnchorPane>

Когда я выбрал сначала 1.item, затем 2.item, затем отменил выбор 1.item (с помощью ctrl); listView.getSelectionModel().getSelectedItems() вернуть ноль, вывод программы:

[1.item]
[1.item, 2.item]
[null]

но когда я выбрал сначала 2.item, затем 1.item, затем отменил выбор 2.item (с помощью ctrl); Результат нормальный, вывод программы:

[2.item]
[1.item, 2.item]
[1.item] 

В чем проблема?

1 ответ

Решение

Через проблему в моем вопросе возникают ошибки, я делюсь своим хитрым способом для этой ситуации (я использовал getSelectedItem() метод, когда getSelectedItems() вернуть ноль). Изменен TestController.java:

package application;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;

import javafx.collections.ObservableList;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener.Change;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ListView;
import javafx.scene.control.SelectionMode;


public class TestController implements Initializable 
{

    @FXML
    ListView<String> listView;

    private ArrayList <String> list;



    @Override
    public void initialize(URL url, ResourceBundle rb) 
    {
        listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        fillList();
        listView.getSelectionModel().getSelectedItems().addListener(
                (Change<? extends String> change) ->
                {
                    list.clear();

                    ObservableList<String> oList = listView.getSelectionModel().getSelectedItems(); 

                    if(oList != null)
                        System.out.println(oList);
                    else
                        System.out.println(listView.getSelectionModel().getSelectedItem());
                });
    }

    private void fillList() 
    {
        list = new  ArrayList<>();
        list.add("1.item");
        list.add("2.item");
        list.add("3.item");

        ObservableList<String> items = FXCollections.observableArrayList(list);
        listView.setItems(items);

    }

}
Другие вопросы по тегам