2017-05-11 6 views
0

Wie kann ich einen Wert zu Elementen in einem Kombinationsfeld hinzufügen, so dass der Benutzer entweder aus den vorhandenen Elementen auswählen oder die Option "Element hinzufügen" auswählen kann, um ein neues Element hinzuzufügen?Hinzufügen eines Werts zu Combo Box von der Benutzeroberfläche?

private ComboBox<String> comboStructDonnees; 

Gefolgt von:

comboData.getItems().addAll("TVW", "VWT", "TTVW", "VWXT", "Add item"); 

Ich weiß nicht, welches Ereignis soll ich als nächstes schaffe ich auf den Text wollen auf dem zusätzlichen Element, wenn möglich eingegeben werden.

Jede Hilfe wäre willkommen.

+0

So meinen Sie Sie der Benutzer möchten die Liste der möglichen Optionen hinzufügen zu können, oder haben Sie zwei Felder haben oder Möchten Sie eine editierbare Combobox? – MadProgrammer

Antwort

1

Sie können ein Element mit einem "speziellen Wert" (z. B. eine leere Zeichenfolge) am Ende der Liste der Elemente für das Kombinationsfeld hinzufügen.

Verwenden Sie eine Zellenfabrik, um eine Zelle zu erstellen, die dem Benutzer eine benutzerfreundliche Nachricht anzeigt (z. B. "Objekt hinzufügen ..."), wenn dieser Wert angezeigt wird. Fügen Sie der Zelle einen Ereignisfilter hinzu, der ein Dialogfeld zum Eingeben eines neuen Werts anzeigt, wenn die Zelle den speziellen Wert anzeigt.

Hier ist eine schnelle SSCCE:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.TextInputDialog; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class AddItemToComboBox extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ComboBox<String> combo = new ComboBox<>(); 
     combo.getItems().addAll("One", "Two", "Three", ""); 
     combo.setCellFactory(lv -> { 
      ListCell<String> cell = new ListCell<String>() { 
       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (empty) { 
         setText(null); 
        } else { 
         if (item.isEmpty()) { 
          setText("Add item..."); 
         } else { 
          setText(item); 
         } 
        } 
       } 
      }; 

      cell.addEventFilter(MouseEvent.MOUSE_PRESSED, evt -> { 
       if (cell.getItem().isEmpty() && ! cell.isEmpty()) { 
        TextInputDialog dialog = new TextInputDialog(); 
        dialog.setContentText("Enter item"); 
        dialog.showAndWait().ifPresent(text -> { 
         int index = combo.getItems().size()-1; 
         combo.getItems().add(index, text); 
         combo.getSelectionModel().select(index); 
        }); 
        evt.consume(); 
       } 
      }); 

      return cell ; 
     }); 

     BorderPane root = new BorderPane(); 
     root.setTop(combo); 
     Scene scene = new Scene(root, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

enter image description here enter image description here enter image description here

+0

Genau das, was ich brauchte, danke! –

Verwandte Themen