我有一个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();
,但它不起作用。
答案 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);
});
可能是更好的解决方案。