2016-04-27 28 views
7

seçili öğelerin birini döndürür TableView çoklu seçimi, seçili nesnelerden birini null olarak döndürür. Bu her zaman olmaz, ancak tablodaki iki satırı seçmeye çalıştığım zamanların çoğunda olur. similar to the issue defined in this questionjavafx8 TableView Çoklu seçim,

Sorunu çoğaltmanın en iyi yolu, iki sıralı satır seçmeyi deneyin. 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> 

Denetleyici:

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

Modeli:

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

helpls umut:. personsTable.getSelectionModel() getSelectedItems() boş" Başka boş değilse burada addListener (yeni InvalidationListener() {..code adını yazdırmak için bulundu "..}; "Shift + Click" ile iki satır seçerek kolayca tekrar üretilebilir, ardından üzerine tıklayarak ikincisi seçilebilir. – DVarga

+1

JavaFX'te (8u60 +) bir hata var. Cevabımıma bakın [here] (http://stackoverflow.com/a/38207246/4185959). – Itai

cevap

0

1: varsayılan hücre fabrikası eklemek için TableView

için

2: geçersiz ya updateItem veya updateIndex

.

ben bir kod biraz güncelledik

+0

Lütfen overrideden updateItem yönteminde yapılması gerekenler hakkında biraz ipucu verebilir misiniz? – user68883

+0

Bu neden sorunu çözmeli? Bir hücre fabrikası, yalnızca seçim modeliyle değil, öğelerin işlenme biçimiyle ilgilidir. – Itai

+0

Daha iyi detaylandırır mısınız? Bunun neden yardımcı olabileceğine dair hiçbir şey göremiyorum. – dinhokz

İlgili konular