12

我在 javafx 中有一个选择框,其中包含 3 个项目,让 AB 和 C 等更改此项目的选择我想执行某些任务,那么我该如何处理这些事件?

 final ChoiceBox cmbx=new ChoiceBox();
    try {
        while(rs.next())
         {
            cmbx.getItems().add(rs.getString(2));

          }
         } 
        catch (SQLException e) 
           {
        // TODO Auto-generated catch block
        e.printStackTrace();
        }

我将项目从数据库添加到选择框...现在我想知道如何处理 javafx 中的选择框事件

4

3 回答 3

22

向 ChoiceBox 的 selectionmodel 和 selectedIndexProperty 添加一个 ChangeListener:

final ChoiceBox<String> box = new ChoiceBox<String>();

    box.getItems().add("1");
    box.getItems().add("2");
    box.getItems().add("3");

    box.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
      @Override
      public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number2) {
        System.out.println(box.getItems().get((Integer) number2));
      }
    });
于 2013-01-25T14:08:47.350 回答
12

Sebastian 解释得很好,如果您只对选择框中选择的实际值感兴趣并且不太关心索引,那么您可以使用 selectedItemProperty 而不是 selectedIndexProperty。

ChangeListener 也是函数式接口,当你使用 java 8 时,你可以在这里使用 lambda。我只是稍微修改了 Sebastian 的示例。newValue 是新选择的值。

ChoiceBox<String> box = new ChoiceBox<String>();
box.getItems().add("1");
box.getItems().add("2");
box.getItems().add("3");

box.getSelectionModel()
    .selectedItemProperty()
    .addListener( (ObservableValue<? extends String> observable, String oldValue, String newValue) -> System.out.println(newValue) );
于 2016-02-09T02:05:48.020 回答
3

我知道这是一个老问题,但更简单的方法是使用ChoiceBox.setOnAction(EventHandler)

ChoiceBox<String> box = ...;
box.setOnAction(event -> {
    System.out.println(box.getValue());
});

或在 FXML 中:

<ChoiceBox fx:id="id" onAction="#controllerMethod">
于 2021-01-14T01:50:00.797 回答