2014-05-13 6 views
5

पर क्लिक करें मैं JavaFX एप्लिकेशन में ListView नियंत्रण का उपयोग कर रहा हूं। यह बहु चयन चयन मोड के लिए सेट है। मैं एक उपयोगकर्ता के रूप में जानता हूं, मैं इसे किसी आइटम को अचयनित करने के लिए Ctrl- क्लिक कर सकता हूं, लेकिन यह मेरे उपयोगकर्ताओं के लिए सहज नहीं है। मैं इसे अचयनित करने के लिए दूसरी बार क्लिक करने का एक तरीका चाहता हूं। दूसरे शब्दों में एक बार क्लिक करें - चुनें; चयनित आइटम पर क्लिक करें और यह अचयनित हो जाता है।एक javafx सूची दृश्य पर किसी आइटम को अचयनित करें

मैंने एक चेंजलिस्टर और ऑन-हाउसस्क्टेड ईवेंट दोनों का उपयोग करने का प्रयास किया है। न तो बहुत अच्छी तरह से काम करता है। नीचे प्रत्येक के कोड स्निपेट हैं।

ChangeListener:

प्रभाव - सूची में पहला आइटम कभी नहीं चुना गया है। मैं उस पर क्लिक करता हूं और यह अनजान रहता है। आइटम पर कोई प्रभाव नहीं 2..n

listView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<SpecificAlgorithmData>() { 
    @Override 
    public void changed(final ObservableValue observableValue, final SpecificAlgorithmData oldData, final SpecificAlgorithmData newData) { 

     //if already selected then deselect it 
     int selectedIndex = listView.getSelectionModel().getSelectedIndex(); 
     System.out.println("selected " + selectedIndex); 
     System.out.println("all selected" + listView.getSelectionModel().getSelectedIndices()); 
     if (!selecting && !listView.getSelectionModel().getSelectedIndices().contains(selectedIndex)){ 


      Iterator <Integer> iterator = listView.getSelectionModel().getSelectedIndices().iterator(); 
      selecting = true; 
      listView.getSelectionModel().select(-1);//deselect all 

      while (iterator.hasNext()){ 
       int index = iterator.next(); 
       if (index!= selectedIndex){ 
        listView.getSelectionModel().select(index); 
       } 
      } 
      selecting = false; 
     } 
    } 
} 

onClick:

कोई प्रभाव नहीं है, क्योंकि मुझे यकीन है कि कैसे एक मैं सिर्फ क्लिक किया के सूचकांक पाने के लिए नहीं कर रहा हूँ। कठिन होने के नाते कोडित, यह बस कभी का चयन आइटम 2.

listView.setOnMouseClicked(new EventHandler<MouseEvent>() { 
    @Override 
    public void handle(final MouseEvent mouseEvent) { 
     int selectedItem = 2; //FIXME: How to I get the index of clicked item? 
     if (listView.getSelectionModel().isSelected(selectedItem)){ 
      listView.getSelectionModel().clearSelection(selectedItem); 
     } 
    } 
}); 
+1

कैसे उन कई आइटम चुन सकता हूँ? –

+0

अभी वे नहीं जानते कि वे Ctrl-click के साथ समस्या हो सकती है। मैं चाहता हूं कि वे सिर्फ एक क्लिक (कोई Ctrl कुंजी) के साथ चयन और चयन रद्द करने में सक्षम न हों। –

+2

"Ctrl + Click" का उपयोग कई जीयूआई वेब/डेस्कटॉप अनुप्रयोगों पर एक आम उपयोगकर्ता अनुभव है। आप कृपया इसे अपने उपयोगकर्ताओं को पेश कर सकते हैं। वैकल्पिक रूप से आप सूची कक्षों पर चेकबॉक्स डाल सकते हैं, जो अधिक सहज हो सकता है। –

उत्तर

7

JavaFX में नियंत्रण के व्यवहार बदल रहा है सुंदर मुश्किल है की अनुमति नहीं देता है - वहाँ वास्तव में व्यवहार वर्गों में एपीआई में हैं कोई हुक।

निम्नलिखित में काम करता है, सूची में सेल्स के साथ एक ईवेंट फ़िल्टर पंजीकृत करके, सीधे चयन व्यवहार को लागू करने और घटना का उपभोग करने के लिए।

हालांकि थोड़ा सा नाजुक लगता है (उदाहरण के लिए यदि भविष्य में रिलीज ने माउस दबाए गए माउस पर डिफ़ॉल्ट व्यवहार को लागू करने का फैसला किया है, उदाहरण के लिए; या शायद बेहतर, अगर भविष्य की रिलीज ने अतिरिक्त कार्यक्षमता को संभालने का निर्णय लिया माउस घटनाओं)। तो इस समाधान का उपयोग कुछ "खरीदार सावधान" नोटिस से जुड़ा हुआ है।

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.MultipleSelectionModel; 
import javafx.scene.control.SelectionMode; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class DeselectableList extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ListView<String> list = new ListView<>(); 
     MultipleSelectionModel<String> selectionModel = list.getSelectionModel(); 
     selectionModel.setSelectionMode(SelectionMode.MULTIPLE); 
     for (int i=1; i<=20; i++) { 
      list.getItems().addAll("Item "+i); 
     } 
     list.setCellFactory(lv -> { 
      ListCell<String> cell = new ListCell<>(); 
      cell.textProperty().bind(cell.itemProperty()); 
      cell.addEventFilter(MouseEvent.MOUSE_PRESSED, event -> { 
       list.requestFocus(); 
       if (! cell.isEmpty()) { 
        int index = cell.getIndex(); 
        if (selectionModel.getSelectedIndices().contains(index)) { 
         selectionModel.clearSelection(index); 
        } else { 
         selectionModel.select(index); 
        } 
        event.consume(); 
       } 
      }); 
      return cell ; 
     }); 
     BorderPane root = new BorderPane(list); 
     Scene scene = new Scene(root, 150, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

जाहिर है आप अपने उपयोगकर्ताओं को मैं की तुलना में बेहतर पता है, लेकिन मैं सिर्फ ListView उन्हें यह कैसे उपयोग करने के लिए करने के लिए समझाने पर एक अच्छी टूलटिप के लिए पसंद कर सकते हैं ...

+0

बहुत बहुत धन्यवाद। मैं इसे आज़माउंगा। लेकिन जैसा कि उलुक बताता है कि मैं सिर्फ चेकबॉक्स के साथ एक सूची बॉक्स का उपयोग कर सकता हूं। अंत में यह ग्राहक तक है ... –

+0

हाँ ... चेकबॉक्स शायद जाने का एक बेहतर तरीका है। यह उतना ही स्पष्ट है जितना आप इसे अपने उपयोगकर्ताओं के लिए बना सकते हैं;)। –

+0

अच्छा! अनुरोध फोकस(); चाल बनाई मैं कुछ सूचियों के माध्यम से "आगे बढ़ रहा हूं" -> जब उपयोगकर्ता अपना चयन बदलता है (उसने पहले बनाया) और पिछली सूची (जैसे पीछे की ओर नेविगेट करना) का चयन करता है, जो एक निष्क्रिय स्थिति में रहता है उसे अमान्य/फेंक दिया जाना चाहिए (निष्क्रिय चयन ने जीयूआई गलत बना दिया)। धन्यवाद! –

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