2016-07-27 11 views
1

Ich habe eine ComboBox, die die folgende Implementierung wie im folgenden Code gezeigt hat. Das Problem, dem ich gegenüberstehe, ist, dass ich nur ChangeListener einmal für einen ausgewählten Gegenstand auslösen kann. Ich möchte so oft auslösen, wie ich auf den gleichen Gegenstand klicke.Trigger ComboBox Auswahlereignis für den gleichen Artikel

int lastGridRowPos = 4; 
ObservableList<String> options = FXCollections.observableArrayList(
       "IdentityFile", 
       "LocalForward", 
       "RemoteForward", 
       "ForwardAgent", 
       "ForwardX11" 
     ); 

ComboBox propertyBox = new ComboBox(options); 
propertyBox.valueProperty().addListener(new ChangeListener<String>() { 
    @Override 
    public void changed(ObservableValue ov, String t, String t1) { 
     System.out.println("SELECTED=" + t1); 
     int rowCounter = getRowCount(grid); 
     grid.add(new Label(t1), 0, rowCounter + 1); 
     TextField field = newTextFieldWithIdPrompt(t1.toUpperCase(), ""); 
     grid.add(field, 1, rowCounter + 1); 
     propertyBox.getSelectionModel().clearSelection(); 
    } 
}); 

Ich habe versucht, um die Auswahl zu löschen, so dass ich wieder auf dem gleiche Elemente klicken kann (in der Hoffnung, dass das Kombinationsfeld eine Änderung in Artikel sieht) unter Verwendung von Arbeits propertyBox.getSelectionModel().clearSelection(); aber es ist nicht.

Antwort

2

Ich bin fast sicher, dass eine einfachere Lösung existiert, aber man könnte versuchen, die setCellFactory zu verwenden und ein EventFilter zu der zurück ListCell Instanz hinzufügen:

propertyBox.setCellFactory(param -> { 
    final ListCell<String> cell = new ListCell<String>() { 
     @Override 
     public void updateItem(String item, boolean empty) { 
      super.updateItem(item, empty); 
      if (!empty) 
       setText(item); 
     } 
    }; 
    cell.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> { 
     propertyBox.setValue(null); 
     propertyBox.getSelectionModel().select(cell.getItem()); 

     e.consume(); 
    }); 
    return cell; 
}); 

Dies ListCell s wird die Maus gedrückt Ereignisse auf der Liste erfassen Artikel innerhalb der ComboBox und verbraucht diese Veranstaltung. Dann setzen sie die valueProperty der ComboBox manuell auf null (um die Auswahl zu löschen) und dann setzt sie diese Eigenschaft auf das Element, was die ListCell anzeigt.

Dann in den ChangeListener des valueProperty Sie müssen nur für null s überprüfen:

propertyBox.valueProperty().addListener((obs, oldVal, newVal) -> { 
    if (newVal != null) 
     System.out.println("Selected: " + newVal); 
}); 

Zusätzliche Anmerkung:

Ich weiß nicht, Ihren genauen Fall verwenden, aber vielleicht ein Menu mit MenuItem s ist eine bessere Lösung.

+0

Danke für die Lösung (ich muss es in meinem Fall noch ausprobieren). Nun, wenn Sie es gesagt haben, frage ich mich, warum ein Menü für mich nicht funktionieren würde. Ich werde mir die Speisekarte ansehen. Alles, was ich tun möchte, ist eine Liste von Dingen für den Benutzer zur Verfügung zu stellen, aus denen er den gleichen Gegenstand immer und immer wieder auswählen kann. – summerNight