問題は基本的に発生しますそのリストの変更が処理されています。これはAPIの欠陥の一種です。回避策(ハック)、再びそれを変更する前に、完全に最初の変更をできるようになるように、フィルタリングされたリストを使用し、Platform.runLater(...)
で、リスト上の述語を更新することです:
import javafx.application.Application;
import javafx.application.Platform;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.collections.transformation.FilteredList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ComboBoxNoSelectedItem extends Application {
@Override
public void start(Stage primaryStage) {
ObservableList<String> allItems = FXCollections.observableArrayList("One", "Two", "Three", "Four", "Five");
ComboBox<String> combo = new ComboBox<>();
combo.setValue(allItems.get(0));
FilteredList<String> items = allItems.filtered(item -> item != combo.getValue());
combo.setItems(items);
combo.valueProperty().addListener((obs, oldValue, newValue) -> Platform.runLater(() -> items.setPredicate(item -> item != newValue)));
BorderPane root = new BorderPane();
root.setTop(combo);
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
たぶんクリーナーアプローチはちょうどにあります近いが、全く同じではない、UXで現在選択されている項目、表示セルを無効にする:あなたが選択した項目を削除した場合
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ComboBoxNoSelectedItem extends Application {
@Override
public void start(Stage primaryStage) {
ObservableList<String> allItems = FXCollections.observableArrayList("One", "Two", "Three", "Four", "Five");
ComboBox<String> combo = new ComboBox<>(allItems);
combo.setCellFactory(lv -> new ListCell<String>() {
{
disableProperty().bind(combo.valueProperty().isEqualTo(itemProperty()));
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(item);
}
});
BorderPane root = new BorderPane();
root.setTop(combo);
primaryStage.setScene(new Scene(root, 400, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
は、その後、明らかに選択が変更する必要があります。ここで実際に何をしたいのですか? (なぜセレクションの変更のリストを変更していますか?) –
comboBoxに表示したい値を選択しましたが、そのアイテムをリストから削除したいので、そのコンボを再度クリックします既に選択されているものを除くすべてのオプションとして表示されます –