質問: ( /* TextField */ ); } } //============================================================================== ```
回答: 残念ながら再現できなかったです。 なお、推測で恐縮ですが原因に心当たりがあるのでコメントします。間違ってるかもしれないのでそこはご容赦を。 自分の推測はJDK8でのJavaFXのバグではないかと思います。 JavaFXのListViewやTableViewに用いられているMultiSelectionModelの実装クラスMultipleSelectionModelBaseにはバグがありまして「どの位置の選択状態が変化したか」のインデックスの情報が不正になる場合があります。そのようなケースではListChangeListener.Changeに対してgetRemovedやgetAddedSubListを呼び出すと例外(IndexOutOfBoundsなど)が発生します。 本件の例外発生個所の数行前(3046行目)でgetRemovedを呼び出してますのでおそらくはこのバグの影響で不正なインデックスにより選択解除アイテムを求めたためNPEが発生していると思いました。 OracleへのバグレポートJDK-8165222の状況をみるとJDK8u60以降にバグが作りこまれたこととJDK9では発生しないことが分かっています。 レポート時期は昨年8月ですが現在に至るまでJDK8では対策されてません。担当の言を自分なりに解釈すると「JDK9では大規模なリファクタリングによりこのバグは治った。JDK8に本件だけ対策するのは可能だけどデグレードしないためにはちゃんとテストしなきゃいけない(のですぐに入れるのは厳しいかな...)」みたいな感じでしょうか > > This is fixed in JDK 9 through a large amount of refactoring work. Backporting just this fix would be possible, but also most probably substantial work to identify the right (and minimal) change, as well as testing to avoid other regressions (fortunately selection is quite well tested). > > > 対処: * SelectionMode.SINGLEを用いる 上に述べたバグは「SelectionMode.MULTIPLE」の場合のみ発生すると自分は考えています。またJDK8では本件はすぐに対策されない気がしてます。そこでもしSelectionMode.SINGLEが許容できるなら回避策になると思います。 * JDK9を用いる JDK9では多分発生しないと思います。まだ正式リリースされてないのでこの選択はイマイチですが。 追記: > > TableView周辺を Javaで書き... > > > 自分はJavascriptには暗くjjsも本質問で初めて知った程度なので以下は話半分くらいに聞いてください。 まずJava(JavaFXも)がボイラープレート的コードが多くなりがちなのでJavascriptでさらさら書けたらさぞうれしかろうと思いました。自分はjavascriptをさらさら書けないのですが、お見受けしたところ質問者さんは苦もなく書いておられるような... 悩ましいのはコントローラーをスッキリ書くためにはデータクラスにJavaFXプロパティーを実装しておきたい点なのですが、これはJavaでしかできそうもなく(?)かつJavaFXプロパティーがボイラープレートそのものなのがイケテないです。(lombokで@FXPropertyアノテーションを作ったらいいというような話を聞いたことがありますがあまり出回ってない(立ち消え?)感じなので残念ながら自分は試したことありません。) あるいはデータクラスだけ我慢してJava側でJavaFXボイラープレートでクラス定義すればかなり気持ちよく作れるのかも知れません。例えば前回の質問にあったPropertyValueFactoryが使えるようになり、編集可能とするための実装はeditableプロパティーを(SceneBuilderで)trueにしてやるだけで済みます(**=>間違い※1**)。(質問者さんはTableCellが編集状態になったときTextFieldを置くといった制御を考えておられるようですがその実装が不要になります) **※1 訂正:「editableをtrueにしただけで済む」は間違いでした。** デフォルトのTableCellでは編集能力を持ってないので編集能力を持ったTableCellの派生クラスを用いないといけませんでした。訂正してお詫びします。なお編集対象がJavaFXプロパティーなら、TextFieldTableCellなどの提供クラスで簡単に実装できるため、やはりJavaFXプロパティーをデータクラスに実装した方が楽だとは思います。 余談ですがcssはJavascriptやJava上で書く必要はなく、cssファイルを定義しておき、FXMLでノードにくっつけてあげるほうが楽な気がします。(SceneBuilderでcssをrootノードにくっつけておけます) 取り留めないコメントで失礼しました。