Я хочу установить одно значение поля со списком, как это
<ComboBox fx:id="dimensionCombo" editable="true" promptText="Other" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="13" GridPane.vgrow="ALWAYS">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="30X20" />
<String fx:value="30X40" />
<String fx:value="30X50" />
<String fx:value="60X40" />
</FXCollections>
</ComboBox>
Но когда я делаю dimensionCombo.getValue()
, я должен получить другое значение, например 600
для <String fx:value="30X20"/>
, 1200
для <String fx:value="30X40"/>
и так далее. Это возможно? если да, то как?
Теперь я делаю (в контроллере)
...
if(dimensionCombo.getValue().equals("30X20")) {
int value = 600;
}
else if(dimensionCombo.getValue().equals("30X40")) {
int value = 1200;
}
...
Есть ли лучший способ сделать это?
Определите класс для хранения ваших данных, например:
public class Dimension {
private final int width ;
private final int height ;
public Product(
@NamedArg("width") int width,
@NamedArg("height") int height) {
this.width = width ;
this.height = height ;
}
public int getWidth() {
return width ;
}
public int getHeight() {
return height ;
}
public int getArea() {
return width * height ;
}
@Override
public String toString() {
return String.format("%d X %d", width, height);
}
}
Аннотации @NamedArg
позволяют вам предоставлять аргументы конструктора в файле FXML, поэтому в вашем FXML вы можете сделать
<ComboBox fx:id="dimensionCombo" editable="true" promptText="Other" prefWidth="150.0" GridPane.columnIndex="1" GridPane.rowIndex="13" GridPane.vgrow="ALWAYS">
<items>
<FXCollections fx:factory="observableArrayList">
<Dimension width="30" height="20" />
<Dimension width="30" height="40" />
<Dimension width="30" height="50" />
<Dimension width="60" height="40" />
</FXCollections>
</items>
</ComboBox>
И в вашем контроллере вы можете сделать
@FXML
private ComboBox<Dimension> dimensionCombo ;
// ...
int value = dimensionCombo.getValue().getArea();
Если вы хотите, чтобы поле со списком было редактируемым, вам необходимо предоставить StringConverter<Dimension>
, чтобы позволить combo box создать новый объект Dimension
из значения, введенного в текстовое поле. В контроллере добавьте
public void initialize() {
dimensionCombo.setConverter(new StringConverter<Dimension>() {
@Override
public String toString(Dimension d) {
return d.toString();
}
@Override
public Dimension fromString(String s) {
String[] factors = s.split("[xX]");
if (factors.length != 2) {
return null ;
}
try {
int w = Integer.parseInt(factors[0].trim());
int h = Integer.parseInt(factors[1].trim());
return new Dimension(w, h);
} catch (NumberFormatException e) {
return null ;
}
}
});
// ...
}