【问题标题】:Change TextField Value based on a combination of Comboboxes selection JavaFX and Java 1.7根据组合框选择 JavaFX 和 Java 1.7 的组合更改 TextField 值
【发布时间】:2016-05-01 02:43:03
【问题描述】:

我有多个组合框,基于组合框组合的部分,我想设置 TextField 的值。例如,我们有一个水果类型的订单,我们需要 1) 选择水果的类型 2) 水果的数量。然后根据类型和计数设置 TextField。这是一个例子。

public class FruitsOrderController implements Initializable {

    @FXML
    private ComboBox fruitTypeBox, fruitCountBox ;
    @FXML
    private TextField fruitOrder; 

    ObservableList<String> fruitTypeList = FXCollections.observableArrayList("Apples", "Oranges");
    ObservableList<Integer> applesCountList = FXCollections.observableArrayList(5,6,7);
    ObservableList<Integer> orangesCountList = FXCollections.observableArrayList(1,2,3);

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        fruitTypeBox.setItems(fruitTypeList);
        fruitTypeBox.setValue("Oranges");
        fruitCountBox.setItems(orangesCountList);
        fruitCountBox.setValue(3);
    }
    @FXML
    public void fruitOrder(){
        if (fruitTypeBox.getValue().equals("Apples")){
            fruitCountBox.setItems(applesCountList);
            fruitCountBox.setValue(7);
         }

        if (fruitTypeBox.getValue().equals("Oranges")){
            fruitCountBox.setItems(orangesCountList);
            fruitCountBox.setValue(3);
        }
      }
  }

现在,我做了以下选择 1) Fruits Type = Oranges 2) Fruits Count 3 我想更改我的 TextFiled 以反映我的选择,如下图所示。

【问题讨论】:

  • 我用例子相应地修改了问题,请看一下。再次感谢您的帮助!!!

标签: java javafx combobox


【解决方案1】:

如果你只想监听 subcomboBox 的变化,你可以像这样添加一个监听器:

subcomboBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
  @Override public void changed(ObservableValue<? extends String> selected, String oldSelect, String newSelect) {
    if (oldSelect != null) {
      switch(oldSelect) {
        case "ABC": textfield.setText("ABC");  break;
        case "DEF": textfield.setText("DEF"); break;
        //....
      }
    }
    if (newSelect != null) {
      switch(newSelect) {case "ABC": textfield.setText("ABC");  break;
        case "DEF": textfield.setText("DEF"); break;
      }
    }  
  }
});

【讨论】:

【解决方案2】:

您可以通过将侦听器添加到ComboBoxes 的SelectionModels 来做到这一点。

如果您创建一个类Fruit 对数据进行分组并提供创建输出String 的方法,那么它还将提高代码质量:

public class Fruit {

    private final String type;
    private final ObservableList<Integer> counts;
    private final int defaultCount;

    public Fruit(String type, int defaultCount, Integer... counts) {
        if (type == null || counts == null) {
            throw new IllegalArgumentException("null not allowed");
        }
        this.type = type;
        this.counts = FXCollections.observableArrayList(counts);

        if (this.counts.contains(null)) {
            throw new IllegalArgumentException("null not allowed as count");
        }

        if (!this.counts.contains(defaultCount)) {
            throw new IllegalArgumentException("default count must be contained in counts");
        }
        this.defaultCount = defaultCount;
    }

    public String getText(Integer count) {
        return count == null ? null : count + " " + type;
    }

    public ObservableList<Integer> getCounts() {
        return counts;
    }

    public String getType() {
        return type;
    }

    public int getDefaultCount() {
        return defaultCount;
    }

}

使用这个类,你可以像这样修改你的代码:

@FXML
private ComboBox<Fruit> fruitTypeBox;
@FXML
private ComboBox<Integer> fruitCountBox;

@FXML
private TextField fruitOrder;

private final ObservableList<Fruit> fruitTypeList = FXCollections.observableArrayList(
        new Fruit("Apples", 7, 5, 6, 7),
        new Fruit("Oranges", 3, 1, 2, 3));

@Override
public void initialize(URL url, ResourceBundle rb) {
    fruitTypeBox.setConverter(new StringConverter<Fruit>() {

        @Override
        public String toString(Fruit object) {
            return object.getType();
        }

        @Override
        public Fruit fromString(String string) {
            for (Fruit fruit : fruitTypeList) {
                if (fruit.getType().equals(fruit)) {
                    return fruit;
                }
            }
            return null;
        }
    });

    fruitTypeBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Fruit>() {

        @Override
        public void changed(ObservableValue<? extends Fruit> observable, Fruit oldValue, Fruit newValue) {
            if (newValue == null) {
                fruitOrder.setText(null);
                fruitCountBox.setItems(null);
            } else {
                fruitCountBox.setItems(newValue.getCounts());
                int defaultCount = newValue.getDefaultCount();
                fruitCountBox.setValue(defaultCount);
                fruitOrder.setText(newValue.getText(defaultCount));
            }
        }
    });

    fruitCountBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Integer>() {

        @Override
        public void changed(ObservableValue<? extends Integer> observable, Integer oldValue, Integer newValue) {
            Fruit fruit = fruitTypeBox.getValue();
            fruitOrder.setText(fruit == null ? null : fruit.getText(newValue));
        }
    });

    fruitTypeBox.setItems(fruitTypeList);
    fruitTypeBox.setValue(fruitTypeList.get(1));
}

【讨论】:

  • 感谢 Fabian,您能否修改 Java 1.7 的代码。我收到不支持的 lambda 表达式。
  • @Moe:使用匿名类很容易做到这一点,因为没有使用this,但我还是修改了代码。
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 2013-11-18
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多