2016-04-27 38 views
7

TableView multi selezione restituisce uno degli oggetti selezionati come null. Questo non accade ogni volta ma succede la maggior parte delle volte quando provo a selezionare due righe nella tabella. similar to the issue defined in this questionjavafx8 TableView Multiselection restituisce uno degli elementi selezionati come null

Il modo migliore per riprodurre il problema è provare a selezionare due righe sequenziali. 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; 
    } 
} 

Modello:

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; 

} 
+0

Ho aggiornato il codice un po 'con:.. personsTable.getSelectionModel() getSelectedItems() addListener (nuova InvalidationListener() {..code qui per stampare nome se non nullo altro "null trovato" ..}; Facilmente riproducibile selezionando due file con "Maiusc + clic", quindi selezionando il secondo facendo clic su di esso. – DVarga

+1

È un bug in JavaFX (8u60 +). Vedi la mia risposta [qui] (http://stackoverflow.com/a/38207246/4185959). – Itai

risposta

0

1: aggiungere una fabbrica di celle predefinito al tuo TableView

2: ignorare o updateItem o updateIndex

spero che helpls

+0

Potrebbe essere utile dare qualche suggerimento su cosa deve essere fatto nel metodo updateItem sottoposto a override? – user68883

+0

Perché questo dovrebbe risolvere il problema? Una cella di produzione riguarda solo il modo in cui gli oggetti sono resi, non il modello di selezione. – Itai

+0

Puoi elaborarlo meglio? Non riesco a vedere alcuna ragione per cui ciò possa essere d'aiuto – dinhokz