基于组合框选择JavaFX和Java1.7更改TextField值

基于组合框选择JavaFX和Java1.7更改TextField值,java,javafx,combobox,Java,Javafx,Combobox,我有多个组合框,基于组合框组合的部分,我想设置TextField的值。比如说,我们有一个水果类订单,我们需要1)选择水果的类型2)水果的数量。然后根据类型和计数设置TextField。这里有一个例子 public class FruitsOrderController implements Initializable { @FXML private ComboBox fruitTypeBox, fruitCountBox ; @FXML private Text

我有多个组合框,基于组合框组合的部分,我想设置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);
        }
      }
  }
公共类FruissOrderController实现可初始化{
@FXML
专用组合框水果类型框、水果计数框;
@FXML
私人文本字段水果订单;
ObservableList水果类型列表=FXCollections.observableArrayList(“苹果”、“橙子”);
ObservableList applesCountList=FXCollections.observableArrayList(5,6,7);
ObservableList orangesCountList=FXCollections.observableArrayList(1,2,3);
@凌驾
公共void初始化(URL、ResourceBundle rb){
设置项(水果类型列表);
设置值(“橙子”);
水果计数箱。设置项(橙色计数列表);
设置值(3);
}
@FXML
公共秩序{
if(fruitTypeBox.getValue().equals(“苹果”)){
设置项(applesCountList);
设置值(7);
}
if(fruitTypeBox.getValue().equals(“橙子”)){
水果计数箱。设置项(橙色计数列表);
设置值(3);
}
}
}
现在,我做了以下选择1)水果类型=橙子2)水果计数3,我想更改文本字段以反映我的选择,如下图所示。

如果您只想侦听子通讯盒中的更改,可以添加如下侦听器:

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;
      }
    }  
  }
});
@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));
}
subcomboBox.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){

@Override public void changed(ObservalEvalue如果您只想在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;
      }
    }  
  }
});
@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));
}
subcomboBox.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){

@覆盖已更改的公共无效(ObservableValue您可以通过将侦听器添加到组合框的
SelectionModel
s来完成此操作

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

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

}
公共类水果{
私有最终字符串类型;
私人最终观察者计数;
私人最终计数;
公共水果(字符串类型、int-defaultCount、整数…计数){
如果(类型==null | |计数==null){
抛出新的IllegalArgumentException(“不允许为null”);
}
this.type=type;
this.counts=FXCollections.observableArrayList(计数);
if(this.counts.contains(null)){
抛出新的IllegalArgumentException(“null不允许作为计数”);
}
如果(!this.counts.contains(defaultCount)){
抛出新的IllegalArgumentException(“默认计数必须包含在计数中”);
}
this.defaultCount=defaultCount;
}
公共字符串getText(整数计数){
返回计数==null?null:count+“”+类型;
}
公共可观察列表getCounts(){
返回计数;
}
公共字符串getType(){
返回类型;
}
public int getDefaultCount(){
返回默认计数;
}
}
使用此类,您可以如下方式修改代码:

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;
      }
    }  
  }
});
@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));
}
@FXML
私人组合框;
@FXML
专用组合框和计数框;
@FXML
私人文本字段水果订单;
private final ObservableList水果类型列表=FXCollections.observableArrayList(
新水果(“苹果”,7,5,6,7),
新水果(“橙子”,3,1,2,3));
@凌驾
公共void初始化(URL、ResourceBundle rb){
setConverter(新的StringConverter(){
@凌驾
公共字符串toString(水果对象){
返回object.getType();
}
@凌驾
公共水果串(串串){
for(水果:水果类型列表){
if(fruit.getType().equals(fruit)){
还果;
}
}
返回null;
}
});
水果类型框.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(observeveValue您可以通过将侦听器添加到
组合框的
SelectionModel
s来实现这一点

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

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

}
公共类水果{
私有最终字符串类型;
私人最终观察者计数;
私人最终计数;
公共水果(字符串类型、int-defaultCount、整数…计数){
如果(类型==null | |计数==null){
抛出新的IllegalArgumentException(“不允许为null”);
}
this.type=type;
this.counts=FXCollections.observableArrayList(计数);
if(this.counts.contains(null)){
抛出新的IllegalArgumentException(“null不允许作为计数”);
}
如果(!this.counts.contains(defaultCount)){
抛出新的IllegalArgumentException(“默认计数必须包含在计数中”);
}
this.defaultCount=defaultCount;
}
公共字符串getText(整数计数){
返回计数==null?null:count+“”+类型;
}
公共可观察列表getCounts(){
返回计数;
}
公共字符串getType(){
返回类型;
}
public int getDefaultCount(){
返回默认计数;
}
}
使用此类,您可以如下方式修改代码:

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;
      }
    }  
  }
});
@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));
}
@FXML
私人组合框;
@FXML
专用组合框和计数框;
@FXML
私人文本字段水果订单;
私人最终可观测