4

JavaFX 2 で、startEdit() メソッドをオーバーライドしてフォーカスを要求するカスタム TableCell を作成しました。そのため、セルで編集コマンドを呼び出すとすぐに、表示される編集テキスト フィールドがフォーカスされます。

次のステップは、キャレット位置をテキスト フィールドの末尾に設定することです。しかし、理由は不明ですが、うまくいかないようです。常に 1 番目の文字の前に配置されます。

これが私がこれまでに試したことです:

public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();
        createTextField();
        setText(null);
        textField.end();
        setGraphic(textField);
        ((TextField)getGraphic()).end();
        textField.end();

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        getGraphic().requestFocus();
                    }
                });
    }
}


public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();
        createTextField();
        setText(null);
        setGraphic(textField);
        textField.end();

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        getGraphic().requestFocus();
                        textField.end(); 
                        ((TextField)getGraphic()).end();
                    }
                });
    }
}


public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();

        createTextField();
        setText(null);
        textField.end();
        setGraphic(textField);
        ((TextField)getGraphic()).end();
        getGraphic().requestFocus();
        ((TextField)getGraphic()).end();
        textField.end();
    }
}

論理的なアプローチは、テキスト フィールドにフォーカスをリクエストしてからキャレットを移動することですが、いずれの理由でも機能しないようです。

多分誰かが私を啓発することができますか?

4

2 に答える 2

1

私は同じ問題を抱えていましたが、さまざまなことを試した後、最終的に解決策を見つけました。

理由は聞かないでください。ただし、編集ごとに新しい TextField を作成することが問題の原因のようです。既存のテキストフィールドを再利用するとうまくいきます!

だからこれを試してください:

public void startEdit() {
    if (!isEmpty()) {
        super.startEdit();

        if (textField == null)
            createTextField();
        else
            textField.setText(getString());

        setText(null);
        setGraphic(textField);

        Platform.runLater(
                new Runnable() {
                    @Override
                    public void run() {
                        textField.requestFocus();
                        textField.deselect(); 
                        textField.end(); 
                    }
                });
    }
}
于 2014-10-03T08:43:48.457 に答える