Javafx8 tableview multisection returns one of the selected items to null
•
Java
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
二维码