GanttProjectで日本語入力するとIndexOutOfBoundsException
久々にガントチャートを書くために GanttProject を使ったら、エラーが発生して使えませんでした。GanttProject 画面右下の「エラー」のカウントがどんどん増えていって、保存終了もできない状態になりました。
「エラー」をクリックするとこんな感じのスタックトレースがずーーーっと続いていました。
12月 17, 2022 6:01:32 午前 net.sourceforge.ganttproject.GPLogger logToLogger
警告: Index -1 out of bounds for length 4
java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 4
at java.base/jdk.internal.util.Preconditions.outOfBounds(Unknown Source)
at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Unknown Source)
at java.base/jdk.internal.util.Preconditions.checkIndex(Unknown Source)
at java.base/java.util.Objects.checkIndex(Unknown Source)
at java.base/java.util.ArrayList.get(Unknown Source)
at javafx.base/com.sun.javafx.collections.ObservableListWrapper.get(Unknown Source)
at javafx.base/com.sun.javafx.collections.VetoableListDecorator.get(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateCachedBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.recomputeBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.doComputeGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.access$200(Unknown Source)
at javafx.graphics/javafx.scene.Parent$1.doComputeGeomBounds(Unknown Source)
at javafx.graphics/com.sun.javafx.scene.ParentHelper.computeGeomBoundsImpl(Unknown Source)
at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBoundsImpl(Unknown Source)
at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.superComputeGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.layout.Region.doComputeGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.layout.Region.access$300(Unknown Source)
at javafx.graphics/javafx.scene.layout.Region$1.doComputeGeomBounds(Unknown Source)
at javafx.graphics/com.sun.javafx.scene.layout.RegionHelper.computeGeomBoundsImpl(Unknown Source)
at javafx.graphics/com.sun.javafx.scene.NodeHelper.computeGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.updateGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.getGeomBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.computeLocalBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.updateLocalBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.getLocalBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.updateTxBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.getTransformedBounds(Unknown Source)
at javafx.graphics/javafx.scene.Node.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Parent.updateBounds(Unknown Source)
at javafx.graphics/javafx.scene.Scene$ScenePulseListener.pulse(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.Toolkit.lambda$runPulse$2(Unknown Source)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at javafx.graphics/com.sun.javafx.tk.Toolkit.runPulse(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.Toolkit.firePulse(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulse(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.pulseFromQueue(Unknown Source)
at javafx.graphics/com.sun.javafx.tk.quantum.QuantumToolkit.lambda$runToolkit$11(Unknown Source)
at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(Unknown Source)
at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
IMEを起動せず入力する分にはエラーは発生しないんですけど、IMEをオンにして日本語入力すると発生するようです。
OpenJDK 17 がまずいのかと思い、GanttProject 推奨の bellsoft の Liberica JDK を入れてみましたが変わらず。ダメ元で Oracle の Java SE も入れてみましたが、変わらずでした。
デバッグでもしてみようと、GanttProject のビルド方法のページを見て、ソースからビルドしてみたりもしたのですが、そもそも、スタックトレースに GanttProject のソースらしきものはなく、Java や JavaFX しかないので、デバッグしても無駄だと気付きました。
そこで、JavaFX のバグレポートを確認しようと、ORACLE の JavaFX のページを見たら、OpenJFX project のページに行けと。世の中いろいろ変わってるんですねー。
そこから OpenJDK のバグデータベースのページへ行って、「javafx ime」で検索したら、それっぽいものがありました!
が、ステータスはオープンのまま、再現が困難で落ちないから重要性は低く、優先順位を下げるそうです。(泣)
バグ報告の中に、 Microsoft PinYin IME だけで発生する、という記述がありました。だったらIMEを変えたらうまくいくかも、と思いつきました。
さっそく、Windowsの「設定」から、「時刻と言語」>「言語と地域」>「Microsoft IME」>「全般」の「以前のバージョンの Microsoft IME を使う」をONにしました。
で、GanttProject を立ち上げ、日本語をバシバシ入力してみましたが、普通に使えるようになりました。
そういや、以前使ったときのパソコンは最初から「以前のバージョンの~」をONにして使っていたので不具合がでなかったのですね。