触发同一项目的ComboBox选择事件

时间:2016-07-27 02:23:51

标签: java javafx combobox

我有一个ComboBox具有以下实现,如下面的代码所示。我面临的问题是我只能为所选项目触发ChangeListener次。我想点击同一项目时多次触发。

int lastGridRowPos = 4;
ObservableList<String> options = FXCollections.observableArrayList(
                "IdentityFile",
                "LocalForward",
                "RemoteForward",
                "ForwardAgent",
                "ForwardX11"
        );

ComboBox propertyBox = new ComboBox(options);
propertyBox.valueProperty().addListener(new ChangeListener<String>() {
    @Override
    public void changed(ObservableValue ov, String t, String t1) {
        System.out.println("SELECTED=" + t1);
        int rowCounter = getRowCount(grid);
        grid.add(new Label(t1), 0, rowCounter + 1);
        TextField field = newTextFieldWithIdPrompt(t1.toUpperCase(), "");
        grid.add(field, 1, rowCounter + 1);
        propertyBox.getSelectionModel().clearSelection();
    }
});

我试图清除选择,以便我可以再次点击相同的项目(希望组合框看到项目中的更改)使用propertyBox.getSelectionModel().clearSelection();,但它不起作用。

1 个答案:

答案 0 :(得分:2)

我几乎可以肯定存在一个更简单的解决方案,但您可以尝试使用setCellFactory并在返回的EventFilter实例中添加ListCell

propertyBox.setCellFactory(param -> {
    final ListCell<String> cell = new ListCell<String>() {
        @Override
        public void updateItem(String item, boolean empty) {
            super.updateItem(item, empty);
            if (!empty)
                setText(item);
        }
    };
    cell.addEventFilter(MouseEvent.MOUSE_PRESSED, e -> {
        propertyBox.setValue(null);
        propertyBox.getSelectionModel().select(cell.getItem());

        e.consume();
    });
    return cell;
});

这些ListCell将捕获ComboBox内列表项上的鼠标按下事件并使用这些事件。然后他们手动将valueProperty的{​​{1}}设置为null(以清除选择),然后将此属性设置为ComboBox显示的项目。

然后在ListCell的{​​{1}}中,您只需要检查ChangeListener s:

valueProperty

附加说明:

我不知道您的确切用例,但null propertyBox.valueProperty().addListener((obs, oldVal, newVal) -> { if (newVal != null) System.out.println("Selected: " + newVal); }); 可能是更好的解决方案。