2016-12-01 18 views
5

का उपयोग करके ListView में एकाधिक चयन पर क्लिक करें मैं ListView में एकाधिक आइटम चुनने के विभिन्न तरीकों को खोजने का प्रयास कर रहा हूं। जीयूआई एक टच स्क्रीन मॉनिटर पर चल रहा है, इसलिए मैं CTRL + क्लिक करने में सक्षम नहीं होगा। विभिन्न पिछली पोस्टों के माध्यम से शोध करने से, मैं सभी चयनित वस्तुओं को एक ऐरे में रखकर और फिर अंतिम चयन प्राप्त करने के लिए इसके माध्यम से लूपिंग करके एकाधिक चयन लागू करने में सक्षम हूं। मेरे कोड के साथ एकमात्र समस्या यह है कि CTRL + क्लिक की तुलना में, चयन सुचारू रूप से किया जाता है, जहां मेरा कोड हर बार एक नया आइटम चुने जाने पर एक प्रकार की झिलमिलाहट करता है। तो मूल रूप से सूची दृश्य सभी चयनों को साफ़ करता है और फिर सही का चयन करता है। क्या इस संक्रमण को आसानी से करने का कोई तरीका है? CTRL + क्लिक प्रभाव होने के लिए स्पर्श की नकल करना आसान होगा?CTRL + की नकल करना Javafx

selectedList = new int[totalTypes];//total number of item properties 

for(int x=0; x<selectedList.length;x++){//0 = not selected, 1 = selected 
    selectedList[x]=0; 
} 
testView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 

    testView.setOnMouseClicked(new EventHandler<Event>(){ 
     @Override 
     public void handle(Event event){ 
       if(selectedList[testView.getSelectionModel().getSelectedIndex()]==0){ 
        selectedList[testView.getSelectionModel().getSelectedIndex()]=1; 
       } 
       else{ 
        selectedList[testView.getSelectionModel().getSelectedIndex()]=0; 
       } 

       for(int x=0; x<selectedList.length;x++){ 
        if(selectedList[x]==1){ 
         testView.getSelectionModel().select(x); 
        } 
        else{ 
         testView.getSelectionModel().clearSelection(x);; 
        } 
       } 


     } 

    }); 
+0

आप एक स्पर्श-सक्षम डिवाइस पर उसे चलाना चाहते हैं लगता है, आप का उपयोग करना चाहिए 'setOnTouchPressed' के बजाय' setOnMouseClicked' – TomN

+0

फ्लैश को 'स्पष्ट और रीसेट' कार्रवाई के कारण होना चाहिए, मुझे नहीं लगता कि यह सही डिजाइन के लिए आवश्यक है। – TomN

उत्तर

4

आपको किसी उपयोगकर्ता क्लिक करता है एक ListCell खुद के चयन बदले बजाय मानक घटना से निपटने का उपयोग कर संभाल सकता:

@Override 
public void start(Stage primaryStage) { 
    ListView<Integer> listView = new ListView<>(); 
    listView.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
    listView.getItems().setAll(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); 
    listView.addEventFilter(MouseEvent.MOUSE_PRESSED, evt -> { 
     Node node = evt.getPickResult().getIntersectedNode(); 

     // go up from the target node until a list cell is found or it's clear 
     // it was not a cell that was clicked 
     while (node != null && node != listView && !(node instanceof ListCell)) { 
      node = node.getParent(); 
     } 

     // if is part of a cell or the cell, 
     // handle event instead of using standard handling 
     if (node instanceof ListCell) { 
      // prevent further handling 
      evt.consume(); 

      ListCell cell = (ListCell) node; 
      ListView lv = cell.getListView(); 

      // focus the listview 
      lv.requestFocus(); 

      if (!cell.isEmpty()) { 
       // handle selection for non-empty cells 
       int index = cell.getIndex(); 
       if (cell.isSelected()) { 
        lv.getSelectionModel().clearSelection(index); 
       } else { 
        lv.getSelectionModel().select(index); 
       } 
      } 
     } 
    }); 

    Scene scene = new Scene(listView); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

यह बेकार ढंग से काम करता है। धन्यवाद! जिज्ञासा से बाहर, नोड यहां कैसे काम करता है? मुझे लगता है कि यह आपको सेल को असाइन कर रहा है। तो क्या यह चयनित आइटम के रूप में कार्य करता है? जिस तरह से मैं टच स्क्रीन मॉनीटर का उपयोग करने की योजना बना रहा हूं, तो मेरे सिर में मुझे लगता है कि माउस क्लिक के रूप में उंगली स्पर्श इनपुट होगा? या क्या मुझे घटना को एक स्पर्श में बदलना चाहिए? जो तब से मैं नोड प्राप्त नहीं कर सकता। – Ammar

+0

@ अमार: ['MouseEvent.isSynthesized'] (https://docs.oracle.com/javase/8/javafx/api/javafx/scene/input/MouseEvent.html#isSynthesized--) यह इंगित करता है कि स्पर्श ईवेंट माउस घटनाओं को ट्रिगर करेगा। हालांकि मैंने इसका परीक्षण नहीं किया। उत्तर में कोड कैसे 'ListView'' के वंशज 'नोड' का उपयोग करके होता है (जो कि' ListCell' में 'टेक्स्ट' नोड हो सकता है) माता-पिता के रूप में 'ListCell' ढूंढने का प्रयास करने के लिए। यदि यह किया जा सकता है, तो आगे ईवेंट हैंडलिंग बंद कर दी गई है और चयन को संशोधित करने के लिए 'ListCell' की जानकारी का उपयोग किया जाता है। अन्यथा कोई सेल क्लिक नहीं किया गया था और घटना सामान्य रूप से संभाली जाती है ... – fabian

+0

ओह, मैं देखता हूं, अब और अधिक समझ में आता है। तुम्हारी सहायता सराहनीय है! – Ammar