JavaFx ComboBox valueProperty()。addListener(new ChangeListener <string>()逐步重复

时间:2016-11-28 06:34:16

标签: java javafx combobox controller fxml

我在JavaFX项目上使用ComboBox。当我使用 valueProperty()。addListener(new ChangeListener()) 每次点击都会逐步重复行动

这是我的控制器:

public class Controller  {

// some code 

@FXML
private ComboBox<String> FruitList;


int count = 1;

public void comboAction() {
        FruitList.valueProperty().addListener(new ChangeListener<String>() {
            @Override
            public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
                System.out.println("Selected value : " + newValue);
            }
        });
    //count number of select actions
    System.out.println("Selection number: " + count++);

    }
}

我的FXML文件:

<!--some code-->

<ComboBox fx:id="FruitList" onAction="#comboAction" layoutX="22.0" layoutY="212.0" prefHeight="25.0" prefWidth="234.0" promptText="Choose the current month">
        <items>
            <FXCollections fx:factory="observableArrayList">
                <String fx:value="Apple" />
                <String fx:value="Orange" />
                <String fx:value="Pear" />
            </FXCollections>
        </items>
</ComboBox>

<!--some code-->

输出结果

Selection number: 1

Selected value : Apple

Selection number: 2

Selected value : Pear

Selected value : Pear

Selection number: 3

Selected value : Orange

Selected value : Orange

Selected value : Orange

Selection number: 4

Selected value : Apple

Selected value : Apple

Selected value : Apple

Selected value : Apple

Selection number: 5 Selected value : Pear

Selected value : Pear

Selected value : Pear

Selected value : Pear

Selected value : Pear

Selected value : Pear

1 个答案:

答案 0 :(得分:3)

如果您查看onActionProperty

  

ComboBox操作,每当ComboBox值调用时   财产改变了。

所以当你这样做时:

<ComboBox fx:id="FruitList" onAction="#comboAction" ...>

每当值发生变化时,都会执行comboAction()方法。

但是在这个方法中,你向valueProperty添加了一个新的(并且每次都有额外的)监听器,当下次值改变时,该监听器也将被执行。再次,一次又一次。因此,在每次价值变化时,您都会有一个额外的倾听者。

明确修复了获取侦听器方法体并将其插入到外部方法体中而不添加新的侦听器:

public void comboAction() {
    System.out.println("Selected value : " + FruitList.getValue());
}