2015-06-15 7 views
7

का उपयोग करके चुने गए कई पंक्तियों को खाली किया गया है, तो SelectionMode.MULTIPLE में TableView है। ListChangeListener का उपयोग करके मैं कई पंक्तियों के चयन को पकड़ने में सक्षम हूं (Shift दबाकर)।
अलग-अलग कॉलम

हालांकि मेरा समाधान केवल तभी काम करता है जब आइटम कॉलम के बिना क्षेत्र में या में आइटम का चयन किया जा रहा हो।

  1. ठीक है:: 4 उदाहरण के साथ स्पष्ट करने के लिए Gif 3 आइटम का चयन राज्य कॉलम में शिफ्ट का उपयोग कर
  2. ठीक: IDX कॉलम में शिफ्ट का उपयोग कर 4 आइटम का चयन
  3. ठीक है:का उपयोग करके 4 आइटम चुनना शिफ्ट कॉलम के बिना राज्य कॉलम से क्षेत्र तक
  4. त्रुटि:शिफ्ट राज्य स्तंभ से डेटा आइटम स्तंभ शुरू का उपयोग कर 4 आइटम का चयन करने की कोशिश कर रहा

Selection of multiple items in different columns

समस्या हो कि SelectedItems -List पिछले उदाहरण में जाहिरा तौर पर खाली है लगता है । मैं वास्तव में इस मुद्दे के बारे में आपकी मदद की सराहना करता हूं।

यहाँ मेरी दृष्टिकोण है:

ObservableList<DataRowModel> dataRows = FXCollections.observableArrayList(); 
dataRows.addAll(dataSetModel.getRows()); 
tableDataRow.setItems(dataRows); 
tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState()); 

tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
tableDataRow.getSelectionModel().getSelectedItems() 
.addListener((ListChangeListener.Change<? extends DataRowModel> c) -> { 
    while (c.next()) { 
     c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false)); 
     c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true)); 
     System.out.println(c.getList()); //Empty [] when selected using different columns 
    } 
}); 
बस मेरे कोड का एक बेहतर समझ के लिए

: setSelected(...) मेरी DataRowModel पर एक BooleanProperty जो राज्य-स्तंभ के लिए बाध्य है निर्धारित करता है।

संदर्भ के बिना इस चयनित संपत्ति का उपयोग करने का कारण काफी मूर्खतापूर्ण प्रतीत होता है। हालांकि, कोड के कई अन्य टुकड़े हैं जो चेंजलिस्टर्स चयनित संपत्ति के लिए बाध्य हैं।

SSCCE चलाने के लिए तैयार:

import javafx.application.Application; 
import javafx.beans.property.BooleanProperty; 
import javafx.beans.property.SimpleBooleanProperty; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.beans.property.StringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ListChangeListener; 
import javafx.collections.ObservableList; 
import javafx.scene.Group; 
import javafx.scene.Scene; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.stage.Stage; 

public class TableViewSample extends Application { 

    private TableView<DataRowModel> tableDataRow = new TableView<DataRowModel>(); 
    private TableColumn<DataRowModel, String> tableDataRowNameColumn = new TableColumn<>("Data Item"); 
    private TableColumn<DataRowModel, String> tableDataRowStateColumn = new TableColumn<>("State"); 

    private final ObservableList<DataRowModel> dataRows = 
     FXCollections.observableArrayList(
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false), 
      new DataRowModel("Concinna", false) 
     ); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(500); 
     stage.setHeight(500); 

     tableDataRow.setItems(dataRows); 
     tableDataRowNameColumn.setCellValueFactory(f -> f.getValue().getName()); 
     tableDataRowStateColumn.setCellValueFactory(f -> f.getValue().getState()); 

     tableDataRow.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
     tableDataRow.getSelectionModel().getSelectedItems() 
      .addListener((ListChangeListener.Change<? extends DataRowModel> c) -> { 
      while (c.next()) { 
       c.getRemoved().stream().forEach(remitem -> remitem.setSelected(false));  
       c.getAddedSubList().stream().forEach(additem -> additem.setSelected(true));     
      } 
     }); 

     tableDataRow.getColumns().addAll(tableDataRowNameColumn, tableDataRowStateColumn); 

     ((Group) scene.getRoot()).getChildren().addAll(tableDataRow); 

     stage.setScene(scene); 
     stage.show(); 
    } 

    public static class DataRowModel { 
     private StringProperty name = new SimpleStringProperty(this, "name", ""); 
     private BooleanProperty selected = new SimpleBooleanProperty(this, "selected", true); 
     private StringProperty state = new SimpleStringProperty(this, "state", ""); 

     public DataRowModel(String name, boolean selected) { 
      this.name.setValue(name); 
      this.selected.setValue(selected); 

      this.selected.addListener((observable, oldVal, newVal) -> { 
       getState(); // Refresh State value 
      }); 
     } 

     public StringProperty getName() { 
      return name; 
     } 
     public BooleanProperty isSelected() { 
      return selected; 
     } 
     public void setSelected(boolean selected) { 
      if (this.selected.getValue() != selected) 
       this.selected.setValue(selected); 
     } 

     public StringProperty getState() { 
      String stateStr = ""; 
      if (selected.getValue()) 
       stateStr += "Selected"; 
      state.setValue(stateStr); 
      return state; 
     } 
    } 
} 
+3

छवि अच्छी है में जारी होने की उम्मीद है में ठीक किया गया: -) – kleopatra

+0

जोड़ा गया - जावाएफएक्स कोड को यथासंभव संघनित करने के लिए एसएससीसीई में कुछ अनावश्यक चीजें हटा दी गईं :) – Luke

+4

मैं ओरेकल के व्यक्ति टेबलव्यू उदाहरण को संपादित करके इसे उत्पन्न करने में सक्षम था। यह बग https://bugs.openjdk.java.net/browse/JDK-8096787 के रूप में दायर किया गया है, और 8u60 में तय किया गया है। –

उत्तर

2

मैं संपादन Oracle की व्यक्ति tableview उदाहरण से यह उत्पन्न करने में सक्षम था। एक SSCCE है कि समस्या को दर्शाता है किया जाएगा बेहतर -

यह एक बग, https://bugs.openjdk.java.net/browse/JDK-8096787 के रूप में दर्ज है, और संस्करण 8u60 जो अगस्त 2015

+0

@ क्लोपेट्रा आपका स्वागत है! –