是的,此问题上有threads和guides。他们告诉我,setValue(null)
或getSelectionModel().clearSelection()
应该是答案。但是做这些中的任何一个都会给我一个java.lang.IndexOutOfBoundsException
。
我想要做的是每次将某些内容写入组合框时清除选择。这是因为当你在组合框中写一些东西并且在组合框弹出窗口中仍然选择了其他东西时,它会导致问题并且看起来很奇怪。
这是一个SSCCE:
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.converter.IntegerStringConverter;
public class SSCCE extends Application {
@Override
public void start(Stage stage) {
HBox root = new HBox();
ComboBox<Integer> cb = new ComboBox<Integer>();
cb.setEditable(true);
cb.getItems().addAll(1, 2, 6, 7, 9);
cb.setConverter(new IntegerStringConverter());
cb.getEditor().textProperty()
.addListener((obs, oldValue, newValue) -> {
// Using any of these will give me a IndexOutOfBoundsException
// Using any of these will give me a IndexOutOfBoundsException
//cb.setValue(null);
//cb.getSelectionModel().clearSelection();
});
root.getChildren().addAll(cb);
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
答案 0 :(得分:1)
您遇到了JavaFX ComboBox change value causes IndexOutOfBoundsException问题,导致IndexOutOfBoundsException
。这些都是一种痛苦。
无论如何,您的尝试存在一些逻辑问题:清除所选值将导致编辑器更新其文本,因此即使这样做也会使用户无法键入。所以你想检查改变的值是不是键入的值。这似乎解决了这两个问题:
cb.getEditor().textProperty()
.addListener((obs, oldValue, newValue) -> {
if (cb.getValue() != null && ! cb.getValue().toString().equals(newValue)) {
cb.getSelectionModel().clearSelection();
}
});
您可能需要更改toString()
来电,具体取决于您使用的确切转换器。在这种情况下,它会起作用。