ツリービュー/ TreeTableView - KeyEventのF2は、JavaFXの内部NPEが発生します

マイクげっ歯類:

これを行うことにより、TreeTableViewの列0の「標準」のエディタを置きました:

treeTableView.columns.get(0).setCellFactory( TextFieldTreeTableCell.forTreeTableColumn());

...それは、物事のカップルがの編集を開始することを見つけることがうれしいですTreeItem:1は、セルをクリックすることであり、もう一つは、F2キーを押しにあります。

しかし、私のわずかな失望に、私はアプリを起動すると、選択したがなければ、TreeItemマウスを使用しますが、プログラム的ルートの最初の子を選択したTreeItem(おそらく唯一のキーボードのキーを使用してナビゲートした後)、その後I F2キーを押した場合、 JavaFXのの内部には、このようになりますNPEをスロー:

java.lang.NullPointerException: null
    at com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.activate(TableViewBehaviorBase.java:890)
    at com.sun.javafx.scene.control.inputmap.InputMap.handle(InputMap.java:274)
    at com.sun.javafx.event.CompositeEventHandler$NormalEventHandlerRecord.handleBubblingEvent(CompositeEventHandler.java:218)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:80)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$KeyHandler.process(Scene.java:4058)
    at javafx.scene.Scene$KeyHandler.access$1500(Scene.java:4004)
    at javafx.scene.Scene.processKeyEvent(Scene.java:2121)
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2595)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:217)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:149)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$1(GlassViewEventHandler.java:248)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:390)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:247)
    at com.sun.glass.ui.View.handleKeyEvent(View.java:547)
    at com.sun.glass.ui.View.notifyKey(View.java:971)
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
    at com.sun.glass.ui.gtk.GtkApplication.lambda$runLoop$11(GtkApplication.java:277)

これは、直接に焦点を当て、マウスのプットということができないTreeItemためTreeItemのスーパークラスですObject私は上のフォーカスの所有者のリスナー置くScene何もフォーカス関連の変更は、あなたはをクリックしていることを確認し、TreeTableViewそして、まだ、質的に、何かが変更を行います。

多分それのとは何かBehaviorInputMap「スキン」、または私は無知だそのうち多くの神秘的なJavaFXのもののいずれか。

このような状況下で、1つのオプションF2は何とかキーストロークインターセプトし、デフォルトの機能を防ぎ、また、プログラムの扇動編集するかもしれないと私には思えるTreeItem選択されているが、これはフォーカスを持ちません。

NB私は「キーが押された」との「キーリリース」イベントリスナー置きますTreeTableViewこれらは、次の行が含まれていました。

TreeTablePosition pos = treeTableView.getFocusModel().getFocusedCell();

JavaFX内部がNPEをスロー私が記述している「異常」イベントは、「キーリリース」リスナーに、によって特徴づけ、れpos.col == -1pos.getTableColumn() == null私はまた、NPEは、「キーリリース」ハンドラが応答する前に起こることを、伐採から、伝えることができます。

詳細については、私はマウスクリック最初にせずにF2を押したときにリスナーが何をログに記録したことがない「キーが押された」TreeItem(JavaFXの内部には間違いないため、ExceptionJavaFXの枠組みと仮定するために私をリードし、リスナーに通常の「放送」オフ殺害を)また、任意のユーザーが追加したキー押下リスナーの前に。

なスロー:

あなたが使用してセルを選択した場合TableSelectionModel#select(int,TableColumnBase)、その後NPEは発生しません。

所与の行/列の交点の選択セル。テーブル制御(個々のセルはなく行全体よりも、選択することができる)、その「セル選択」モードである場合、列引数がヌルである場合、そして、この方法は、所与の行のすべてのセルを選択しなければなりません。

例えば:

TreeTableColumn col = treeTableView.getColumns().get(0);
treeTableView.getSelectionModel().select(rowIndex, col);

使用すると上記のフォーカスモデルを心配する必要はありません。デフォルトの選択モデルの実装は(動作を保証しますが、それは確かに礼儀正しい行動だだいないことを確認している場合)あなたのための任意の行+列(すなわち、細胞)を注力してまいりますので、理由はあります。

基本的に、あなたの現在のコードは、行が選択される原因となった/その行の特定のセル集中ではなく。あなたは、「編集モード」を入力しようとしたとき、このようにターゲットにどのセルを決定する方法はありませんでした。私はバグではNPEを検討します。わからない何意味列が選択されていない場合に発生する/焦点を当てたが、コントロールの動作は正常というケースを処理する必要があります。

興味のある方は、以下の私のデバッグプロセスでした。


ここでNPEを担当するコードは次のとおりです。

protected void activate(KeyEvent e) {
    TableSelectionModel sm = getSelectionModel();
    if (sm == null) return;

    TableFocusModel fm = getFocusModel();
    if (fm == null) return;

    TablePositionBase<TC> cell = getFocusedCell();
    sm.select(cell.getRow(), cell.getTableColumn());
    setAnchor(cell);

    // check if we are editable
    boolean isEditable = isControlEditable() && cell.getTableColumn().isEditable();

    // edit this row also
    if (isEditable && cell.getRow() >= 0) {
        editCell(cell.getRow(), cell.getTableColumn());
        e.consume();
    }
}

具体的には、これは問題の行です。

boolean isEditable = isControlEditable() && cell.getTableColumn().isEditable();

どの手段のいずれかcellnullであるかgetTableColumn()はnullを返しています。助けを借りてデバッグするいくつかの後JEP 358:参考NullPointerExceptionsが、我々はそれが後者のことを知っています:

Exception in thread "JavaFX Application Thread" java.lang.NullPointerException: Cannot invoke "javafx.scene.control.TableColumnBase.isEditable()" because the return value of "javafx.scene.control.TablePositionBase.getTableColumn()" is null
    at javafx.controls/com.sun.javafx.scene.control.behavior.TableViewBehaviorBase.activate(TableViewBehaviorBase.java:898)

場合はgetTableColumn()、限りフォーカスモデルに関しては、何の列が存在しない手段が集中し、これは特定のセルがフォーカスされていないこと、その後はnullを返しています。修正プログラムは、特定の行+カラム(すなわち、セル)だけでなく、行全体をフォーカス/選択することです。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377434&siteId=1