私はJava 8の編集可能なComboBoxを持っています。ここでは、デフォルトの項目が太字で、デフォルト以外の項目はCellFactoryによってアンボールドされています。 デフォルトを別のアイテムに変更すると、新しいデフォルトを太字にし、CellFactoryでアンボールドされた古いデフォルトを取得する唯一の方法は、古いデフォルトアイテムと新しいデフォルトアイテムの両方を削除して再追加することです。以前の現在のアイテムが削除されて現在のアイテムが変更されたアイテムに設定されているため、新しいアイテムを処理するコードがかなり必要になります。JavaFX ComboBoxのドロップダウンリストセルを強制的に再レンダリングする方法を教えてください。
セルを汚れて再描画する必要があるため、2つのセルを削除して再追加する必要はありません。
私は半日を過ごしましたが、正しい質問をしていない可能性があります。
私はすべてのコンボボックスの項目をクリアしてそれらをすべて再追加すれば制御コードが簡単になると思いますが、これはあまり効率的ではありません。
編集:要求されたとして、ここCellFactoryです:
bookComboBox.setCellFactory(
new Callback<ListView<String>, ListCell<String>>() {
@Override public ListCell<String> call(ListView<String> param) {
final ListCell<String> cell = new ListCell<String>() {
{
super.setPrefWidth(100);
}
@Override public void updateItem(String item,
boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
if (item.equals(Book.getDefaultBook())) {
setFont(Font.font("System", FontWeight.BOLD, 14));
System.out.println("bookComboBox.setCellFactory: set BOLD item=" + item);
}
else {
setFont(Font.font("System", FontWeight.NORMAL, 14));
System.out.println("bookComboBox.setCellFactory: set NORMAL item=" + item);
}
}
else {
setText(null);
}
}
};
return cell;
}
});
私はレンダリングする際に使用されるだけで、フォント、セルの値を変更していませんよ。 私はonEditCommit()を使用していません。 私はbookComboBox.setOnActionリスナーを使ってコンボボックス選択の変更に反応します。 setOnActionイベントは、テキストがコンボボックスに入力され、アクションキー(ENTER)が押された場合、またはComboboxがフォーカスを失った場合にも発生します。
CellFactoryはどのように実装されていますか?おそらく、必要なのは、その内部のコントロールを更新することだけです。 – Itai
いくつかのコードを表示するか、 '' 'onEditCommit'''を使用してください。原理的には、細胞は自動的に再レンダリングされるべきです。 –
@jorn:セルは自動的に一度だけレンダリングされます。セル内の値を変更したり、再レンダリングするには再度セルを削除または追加しなければならないようです。これらのオプションはすべて、不要なComboBox.setOnActionイベントを発生させます。 –