2016-04-27 6 views
7

तालिका दृश्य बहु चयन चयनित वस्तुओं में से एक को शून्य के रूप में लौटाता है। यह हर बार नहीं होता है लेकिन अधिकांश बार होता है जब मैं तालिका में दो पंक्तियों का चयन करने का प्रयास करता हूं। similar to the issue defined in this questionjavafx8 TableView मल्टीसेक्शन चयनित आइटमों में से एक को शून्य

समस्या को पुन: उत्पन्न करने का सबसे अच्छा तरीका है, दो अनुक्रमिक पंक्तियों का चयन करने का प्रयास करें। 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> 

नियंत्रक:

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

मॉडल:

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

मैं के साथ एक कोड थोड़ा अद्यतन किया है आशा है कि:। personsTable.getSelectionModel() getSelectedItems() addListener (नई InvalidationListener() {..code यहाँ नहीं तो किसी और अशक्त "शून्य नाम मुद्रित करने के लिए मिल गया" ..}; "Shift + Click" का उपयोग करके दो पंक्तियों का चयन करके आसानी से पुन: उत्पन्न करें, फिर उस पर क्लिक करके दूसरे को चुना गया। – DVarga

+1

यह जावाएफएक्स (8u60 +) में एक बग है। मेरा जवाब देखें [यहां] (http://stackoverflow.com/a/38207246/4185959)। – Itai

उत्तर

0

1: अपने tableview

करने के लिए डिफ़ॉल्ट सेल कारखाने जोड़ने

2: ओवरराइड या तो updateItem या updateIndex

यह helpls

+0

कृपया ओवरराइड अपडेट इटैम विधि में क्या करने की आवश्यकता है इस पर कुछ संकेत दें? – user68883

+0

इस मुद्दे को हल क्यों करना चाहिए? एक सेल फैक्ट्री केवल आइटम के तरीके से संबंधित है, न कि चयन मॉडल। – Itai

+0

क्या आप इसे बेहतर तरीके से विस्तृत कर सकते हैं? मुझे कोई कारण नहीं दिख रहा है कि इससे मदद मिलेगी – dinhokz

संबंधित मुद्दे