基于组合框选择JavaFX和Java1.7更改TextField值
我有多个组合框,基于组合框组合的部分,我想设置TextField的值。比如说,我们有一个水果类订单,我们需要1)选择水果的类型2)水果的数量。然后根据类型和计数设置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
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
私人文本字段水果订单;
私人最终可观测