2015-01-06 8 views
10

C'è un modo per popolare un JavaFX ComboBox o ChoiceBox con tutte le enumerazioni di un enum?Compilazione di ComboBox o ChoiceBox JavaFX da enum

Ecco cosa ho provato:

public class Test { 

    public enum Status { 
     ENABLED("enabled"), 
     DISABLED("disabled"), 
     UNDEFINED("undefined"); 

     private String label; 

     Status(String label) { 
      this.label = label; 
     } 

     public String toString() { 
      return label; 
     } 
    } 
} 

In un'altra classe, sto cercando di popolare un ComboBox:

ComboBox<Test.Status> cbxStatus = new ComboBox<>(); 
    cbxStatus.setItems(Test.Status.values()); 

ma ottengo un errore: incompatible types: Status[] cannot be converted to ObservableList<Status>

I Ovviamente ottengo lo stesso problema con uno ChoiceBox.

risposta

16

Se setItem richiede una ObservableList, è necessario assegnarne uno anziché un array.

Prova questo:

ComboBox<Status> cbxStatus = new ComboBox<>(); 
cbxStatus.setItems(FXCollections.observableArrayList(Status.values())); 

Edit: La soluzione del James_D (vedi commento) è la preferita:

cbxStatus.getItems().setAll(Status.values()); 
+4

o 'cbxStatus.getItems() SETALL (Status.values ​​());' –

+0

Oh sì, che uno è meglio:. D – Roland

+0

soluzione James_D è il mio scelto! Thnx –

0

Ho usato FXML per questo. Il mio enum ha un costruttore

<ComboBox GridPane.rowIndex="0" GridPane.columnIndex="1"> 
     <items> 
      <FXCollections fx:factory="observableArrayList"> 
       <Type fx:value="ABC"/> 
       <Type fx:value="DEF"/> 
       <Type fx:value="GHI"/> 
      </FXCollections> 
     </items> 
    </ComboBox> 

public enum Type { 

    ABC("abc"),DEF("def"),GHI("ghi"); 

    private String name; 

    private Type(String theType) { 
     this.name = theType; 
    } 

} 
+0

Una soluzione probabilmente più elegante sarebbe usare 'fx: constant', quindi fa riferimento direttamente ai valori enum piuttosto che fare affidamento sul metodo statico' valueOf'. Alcuni editor possono addirittura fornire il completamento quando si utilizza 'fx: constant'. – Itai