Как установить один текст в элементах ComboBox и получить другое значение в javafx fxml

1

Я хочу установить одно значение поля со списком, как это

<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;
}

...

Есть ли лучший способ сделать это?

  • 0
    Обязательно ли для вас определять коллекцию, которая будет использоваться комбинированным списком в FXML?
  • 0
    Я хочу некоторые значения по умолчанию при загрузке страницы. Итак, я использовал коллекции ... но это не обязательно.
Теги:
javafx
fxml
combobox

1 ответ

1

Определите класс для хранения ваших данных, например:

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 ;
            }
        }
    });

    // ...
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню