Javafx8 tableview multisection returns one of the selected items to null

The tableview multi option returns one of the selected objects as null This doesn't happen every time, but when I try in table Similar to the issue defined in this question, this happens in most cases

The best way to reproduce the problem is to try to select two consecutive rows FXML:

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

<?import javafx.scene.control.Label?>
<?import javafx.scene.control.ProgressBar?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.cell.PropertyValueFactory?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.Region?>
<?import javafx.scene.layout.StackPane?>




<AnchorPane  xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.test.controller.TestController">
                <children>
                    <TableView fx:id="personsTable" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="35.0">
                        <placeholder>
                            <Label text="" />
                        </placeholder>
                        <columns>
                            <TableColumn text="Name">
                                <cellValueFactory>
                                    <PropertyValueFactory property="name" />
                                </cellValueFactory>
                            </TableColumn>
                            <TableColumn text="Address">
                                <cellValueFactory>
                                    <PropertyValueFactory property="address" />
                                </cellValueFactory>
                            </TableColumn>
                            <TableColumn text="Course">
                                <cellValueFactory>
                                    <PropertyValueFactory property="course" />
                                </cellValueFactory>
                            </TableColumn>
                            <TableColumn text="Country">
                                <cellValueFactory>
                                    <PropertyValueFactory property="country" />
                                </cellValueFactory>
                            </TableColumn>
                        </columns>
                    </TableView>
                </children>
            </AnchorPane>

controller:

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



import com.test.model.Person;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SelectionMode;
import javafx.scene.control.TableView;


public class TestController implements Initializable {

    @FXML
    TableView<Person> personsTable = new TableView<Person>();

    @Override
    public void initialize(URL location,ResourceBundle resources) {
        // TODO Auto-generated method stub
        MenuItem combine = new MenuItem("Select");
        combine.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                List<Person> selectedPersons = new ArrayList<Person>(
                        personsTable.getSelectionModel().getSelectedItems());
                for (Person person : selectedPersons) {
                    System.out.println("  the object is " + person);
                }
            }
        });

        ContextMenu contextMenu = new ContextMenu();
        contextMenu.getItems().add(combine);

        personsTable.setContextMenu(contextMenu);

        personsTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);

        personsTable.setItems(getPendingOrders());
    }

    public ObservableList<Person> getPendingOrders() {
        ObservableList<Person> persons = FXCollections.observableArrayList();
        for (int i = 0; i < 100; i++) {
            Person person = new Person();
            person.setName("Name" + i);
            person.setAddress("Address" + i);
            person.setCountry("Country" + i);
            person.setCourse("Course" + i);
            persons.add(person);

        }

        return persons;
    }
}

model:

public class Person {

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getCourse() {
        return course;
    }

    public void setCourse(String course) {
        this.course = course;
    }

    private String name;
    private String address;
    private String country;
    private String course;

}

Solution

1: Add default cell factory to tableview

2: Overwrite updateitem or updateindex

I hope it helps

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>