javaFX

2013-10-21 21 views
5

में दूसरी क्लिक/चयन पर चयनित तालिका पंक्ति को अचयनित करने के लिए कैसे करें मेरी जावाएफएक्स तालिका पर, जब मैं एक पंक्ति पर क्लिक करता हूं, तो वह उस पंक्ति का चयन करता है। अब जब मैं उसी पंक्ति पर दूसरी बार क्लिक करता हूं जिसे पहले चुना गया था, तो मैं उस विशेष पंक्ति को अचयनित करना चाहता हूं। क्या यह संभव है ? यदि संभव हो तो कृपया कुछ उदाहरण कोड साझा करें।javaFX

उत्तर

9

कोड का टुकड़ा नीचे के लिए इस बात की पुष्टि इस आवश्यकता के लिए काम किया करना चाहते हैं।

tableView.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() { 
     @Override 
     public TableRow<Person> call(TableView<Person> tableView2) { 
      final TableRow<Person> row = new TableRow<>(); 
      row.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() { 
       @Override 
       public void handle(MouseEvent event) { 
        final int index = row.getIndex(); 
        if (index >= 0 && index < tableView.getItems().size() && tableView.getSelectionModel().isSelected(index) ) { 
         tableView.getSelectionModel().clearSelection(); 
         event.consume(); 
        } 
       } 
      }); 
      return row; 
     } 
    }); 

ऑरैकल तालिका दृश्य उदाहरण से वही व्यक्ति वर्ग का उपयोग किया गया। मूल जवाब @James_D द्वारा ऑरैकल फ़ोरम में दिया गया था।

+0

यह कार्यान्वयन सभी चयनित वस्तुओं को अचयनित करता है। केवल एक आइटम को अचयनित करने के लिए, 'tableView.getSelectionModel() का उपयोग करें। स्पष्ट चयन (अनुक्रमणिका); ' – Ravvy

0

असल में आप इंडेक्स के रूप में कुछ भी अमान्य चुन सकते हैं। आम तौर पर -1

table.getSelectionModel().select(-1); 

जो पूर्णांक select कॉल पसंद किया जाता है। वैकल्पिक:

table.getSelectionModel().select(null); 

जो वस्तु कॉल select

अगर आप/इस्तेमाल किया पूरे कोड को देखने के लिए इस

public class Main extends Application { 
    @SuppressWarnings("unchecked") 
    @Override 
    public void start(Stage stage) {   
     Scene scene = new Scene(new Group()); 
     TableView<Person> table = new TableView<Person>(); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(300); 
     stage.setHeight(500); 

     final Label label = new Label("Address Book"); 
     label.setFont(new Font("Arial", 20)); 

     table.setEditable(true); 

     TableColumn<Person, String> firstNameCol = new TableColumn<Person, String>("Test Name"); 
     firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("name")); 

     table.getColumns().addAll(firstNameCol); 

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.setPadding(new Insets(10, 0, 0, 10)); 
     vbox.getChildren().addAll(label, table); 

     table.itemsProperty().get().add(new Person("Hans")); 
     table.itemsProperty().get().add(new Person("Dieter")); 

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

     table.getSelectionModel().select(-1); 

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

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

    public class Person { 
     final StringProperty name = new SimpleStringProperty(); 

     Person(String name) { 
      this.name.set(name); 
     } 

     public StringProperty nameProperty() { return this.name; } 
    } 
} 
+0

यह अच्छा होगा अगर आप 'getSelectionModel() को स्पष्ट और चयन (इंट इंडेक्स)' के उल्लेख के साथ अपना उत्तर सुधार सकते हैं और ओपी अनुरोधों के रूप में "चयनित आइटम पर क्लिक पर अचयनित करें" को कार्यान्वित कर सकते हैं। –

+0

@thatslch मैंने उपरोक्त कोड के अपने टुकड़े की कोशिश की। अगर मैं इसे फिर से क्लिक करता हूं तो यह पिछली चयनित पंक्ति को अचयनित नहीं करता है। – Dil

+0

@Dil मैंने आपको गलत समझा: प्रश्न मैंने सोचा कि आपकी समस्या को कैसे साफ़ किया जाए। – thatsIch