如何在ComboBox项中设置一个文本,并在javafx fxml中获取不同的值

时间:2015-04-11 16:23:08

标签: java combobox javafx 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">

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

...

有没有更好的方法呢?

1 个答案:

答案 0 :(得分: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>,以允许组合框根据键入文本字段的值创建新的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 ;
            }
        }
    });

    // ...
}