概要
JavaFXのChoiceBoxインスタンス(ComboBoxについても同様と予想します)
の選択肢リストを入れ替える際に生じる
遅延とメモリ使用増が問題でした。
環境
Win10
Java8
ドロップボックスってなに
クリックすると選択し一覧が出現するアレ。
GUIでは定番の部品ですが、何と呼ぶのが適当でしょうか?
「ドロップダウン」とか「プルダウン」とも呼ばれてますね。
JavaFXではChoiceBoxというクラスのインスタンスが一個のドロップボックスになります。
症状
選択肢となる、アイテムのリストをセットします。
わたしは1000個程度(!)のStringリストをchoiceBox.getItems().addAll( items );
とかで渡しました。
そしたら、
choiceBoxがすでにシーングラフ上に表示済みの場合にこの操作すると、
・GUI全体が数10秒単位で固まる
・使用メモリ量が500MBとか数GBの単位で増加する。
おそらく、リスト中のアイテム1個が足されるたびにリスナーが働いてシーングラフにアクセスするのだと思う。
1000個もセットするな、ということなんですかねえ。
けれどもchoiceBoxが表示される前にセットする分には1000個でも問題ないのです。
choiceBoxが一度でも描画されたらそれまで。
setVisible(false);にしたり親ノードから外して非表示にしても症状は変わらかった。
↑ これが納得いかないのですね。なんでグラフ更新を無効化できないの?
choiceBox.setItems();というメソッドからObservableListをセットし直すという方法も試したが
このメソッドが有効なのは最初の一回だけのようです。
結論
いろいろためしましたが
ChoiceBoxインスタンスを使い捨てにして「シーングラフに表示された後は、インスタンスに対するリスト更新はしない」というのが一番まともなようです。
choiceBoxをfinal にしたいのだが、当面あきらめます。
ぼやき
Java は
こういった実験に時間を費やして進捗が止まる。
なにか間違ってるのだろうか。