JavaFX ComboBoxのshowメソッド使用時にハマった事象と強引な解決方法


初めに

 JavaFXにて、編集可能なComboBoxを用いて、以下のようなサジェストリスト表示を実装しようとした際の話。

事象について

発生した環境

  • OS:Windows7 Service Pack1 (32bit、64bit問わず)
  • Javaのバージョン:バージョン8 更新101

発生事象の詳細

 画面下部に、リストを表示するために必要な領域が足りない場合、コンボボックスの上部に表示される事を期待したが、コンボボックス本体の上に被さって表示された。(JavaFXのComboBoxは、そのような場合に、標準的にコンボボックスの上部に表示してくれるため、同様の動作となることを期待した。)

  • 期待する表示

  • 実際の表示

実装

 コンボボックスのテキスト変更毎に、以下のようにサジェスト表示のリストを更新し、showメソッドでコンボボックスのリストを再表示させる実装とした所、前述の事象が発生した。

// サジェスト表示のリストを作成
List<String> list = ListData.stream().filter((t) -> {
    return (t.contains(s))? true : false;
}).collect(Collectors.toList());

// 一旦、コンボボックスのリストを閉じる
ComboBox.hide();

// コンボボックスのリストを全削除し、今回作成したサジェスト表示リストを設定
ComboBox.getItems().clear();
ComboBox.getItems().addAll(list);

// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();

解決方法

 コンボボックスのリストを再表示する箇所で、表示⇒閉じる⇒もう一度表示という手順を取ると、なぜかうまく表示された。

修正前
// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();
修正後
// コンボボックスのリストを再表示する
ComboBox.arm();
ComboBox.show();
ComboBox.hide();
ComboBox.arm();
ComboBox.show();

 コンボボックスのshowメソッドを用いてリストを表示させる場合の作法として、修正前コードに何か誤りがあるためなのか、単純にJavaFXフレームワークのバグなのか、現時点では不明。
 ご存知の方がいらっしゃいましたら、コメントいただけると幸いです。