2014-09-16 4 views
6

Qual è il modo corretto di inserire un elemento il cui valore è nullo all'interno di un ComboBox? Ho provato ad utilizzare myComboBox.getItems().add(null);, e funziona, ma ogni volta che l'utente seleziona questo valore sulla casella combinata, viene generata un'eccezione sulla console:"Nessun elemento selezionato" nella casella combinata JavaFX?

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException 
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(ReadOnlyUnbackedObservableList.java:136) 

Quindi penso che forse questo non è il modo corretto di farlo . Qualche indizio?

risposta

6

Nella mia esperienza, questo è un problema introdotto in Java 8u20. In Java 8u05 e 8u11, oltre a JavaFX 2.x, è possibile aggiungere null all'elenco di elementi e selezionare questo elemento come previsto. In Java 8u20 si ottiene java.lang.IndexOutOfBoundsException quando si seleziona il valore null.

Benjamin Gale: sarà necessario utilizzare Java 8u20, selezionare un elemento nel ComboBox e quindi selezionare il valore null per visualizzare il problema.

Al momento attuale, l'opzione migliore sembra essere quella di creare un oggetto speciale null e etichettarlo in modo appropriato, come già accennato.

In alternativa, se riesci invece a utilizzare un ChoiceBox, penso che troverai che funziona nel modo desiderato.

+0

Strano, il mio sistema sta segnalando che ho Java 8 update 20 e il codice che ho postato funziona bene. –

+1

Sì, è strano. Non sono sicuro di cosa significhi che il tuo _system stia segnalando che hai l'aggiornamento 20 di Java 8. Sei sicuro di usarlo per eseguire il codice? Se si inserisce 'System.out.println (" Versione Java è: "+ System.getProperty (" java.version "));' nel codice ed eseguirlo, stampa "La versione Java è: 1.8.0_20"? – Tarje

+0

@BenjaminGale ha confermato il IOOB in 8u20 (ma poi, avere un null non ha comunque molto senso, come d'accordo) – kleopatra

0

Penso che debba essere qualcosa con il tuo codice che non ci stai mostrando come il SSCCE qui sotto funziona bene e non lancia alcuna eccezione.

import javafx.application.Application; 
import javafx.collections.FXCollections; 
import javafx.scene.Scene; 
import javafx.scene.control.ComboBox; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class NullComboBoxApp extends Application { 

    @Override 
    public void start(Stage primaryStage) { 

     ComboBox<String> cb = new ComboBox<>(FXCollections.observableArrayList(
       "Option 1", 
       "Option 2", 
       "Option 3" 
     )); 

     cb.getItems().add(null); 

     StackPane root = new StackPane(); 
     root.getChildren().add(cb); 

     Scene scene = new Scene(root, 300, 250); 

     primaryStage.setTitle("Null ComboBox Example"); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

Anche se questo funziona in realtà, del tutto perché ci si vuole che gli utenti siano in grado di selezionare null è oltre me ... è questo in realtà il comportamento desiderato? Sospetto che tu voglia veramente essere in grado di cancellare la selezione corrente, qualcosa del tipo:

cb.getSelectionModel().clearSelection(); 
+0

Penso che SO voglia dare all'utente la possibilità di selezionare un valore vuoto nella casella combinata. Se questo è il caso, allora consiglio di creare un oggetto NULL speciale (Object che rappresenterà lo stato vuoto di combobox) e aggiungerlo all'elenco degli elementi. Ad esempio, nel tuo caso potrebbe essere solo una stringa vuota. Per evitare situazioni in cui è ancora possibile ottenere null come valore selezionato, è possibile forzare la selezione all'inizializzazione del controller chiamando 'cb.getSelectionModel(). SelectFirst()' – SimY4

+0

Ciò non ha ancora senso per me. Avresti ancora un valore 'vuoto' visualizzato nel tuo 'ComboBox'. Cosa significa selezionare un valore vuoto? Se l'utente deve interagire con esso, dovrebbe essere opportunamente etichettato, ad es. '<< Cancella selezione >>'. –

+0

Non c'è niente come un valore vuoto in Combobox (almeno adesso). C'è stato di Combobox, quando non è ancora selezionato nulla. Ma quando l'utente seleziona qualcosa per la prima volta, l'utente non può annullare la sua selezione allo stato precedente. Per dare questa abilità, dovresti creare tu stesso un valore vuoto e aggiungerlo alla lista dei valori possibili. E puoi chiamarlo come vuoi: vuoto, nessun dato, ecc. – SimY4