3

私はJavaFX2.1をテストしており、編集可能なテーブルビューを希望どおりに動作させるようにしています。

JavaFX 2ドキュメントの例をベースとして使用しています:http://docs.oracle.com/javafx/2/ui_controls/table-view.htm

この例には2つの問題があります。

  1. ユーザーは、セルを編集するために3回クリックし、1回は行を選​​択し、1回はセルを選択して編集可能にし、さらにクリックしてTextFieldにフォーカスするように強制されます。
  2. 変更は、Enterキーが押されたときにのみコミットされます。セルの外側でマウスをクリックすると、セルに入力されたデータは失われます。

一方、正しく機能する機能の1つは、テキストを選択し、マウスを使用してTextField内でケアレットを何度でも再配置できることです。

これらの問題の両方に個別に関連する2つの質問があります。

JavaFX2テーブルセルの編集とフォーカス

javafx2.1TableViewの更新

最初の質問への回答がそれ自体で適用される場合、セルを編集するために1回クリックするだけで(行が選択された後)、テキストを選択してキャレットを移動できます。

2番目の質問への回答が単独で適用される場合、編集はEnterキーを押さずにコミットされますが、キャレットの再配置またはテキストの選択は1回しかできません。もう一度試すと、編集がコミットされます。 。

両方の回答を一緒に適用すると、フォーカスが正常に適用され、マウスがクリックされたときに編集がコミットされますが、キャレットの位置を変更したり、テキストを完全に選択したりすることができなくなります。セル内でマウスをクリックすると、編集がコミットされます。

私の質問は、キャレットを配置してテキストを選択する機能を失うことなく、元の2つの問題をどのように修正できるかということです。

4

2 に答える 2

1

jkaufmannのサンプルアプリを彼自身の質問に対する彼の答えで試してみてくださいTableView-バインディングによるより良い編集? 彼のバインディングソリューションとTableView編集セマンティクスの実装は、質問で提起するすべての懸念に適切に対処しているようです。

于 2012-06-27T01:13:45.697 に答える
1

JavaFXフレームワークの精神に基づいて、適切なタイミングでGUIコンポーネントを変更する必要があります。つまり、コントロールのlayoutChildrenメソッドで。カスタムTableCellのlayoutChildrenメソッドをオーバーライドし、カーソル位置を設定してから、たとえば

TextField textField = new TextField() {
    private boolean first = true;

    @Override protected void layoutChildren() {
      super.layoutChildren();

      // Set cursor caret at end of text (and clear highlighting)
      if (first) {
        this.end();
        first = false;
      }
    }
  };

また、Java 1.8.0_241には、TextFieldTableCellの実装にもこの問題が含まれていることに注意してください。さらに悪いことに、TextFieldはTextFieldTableCell実装に対して完全にプライベートであるため、これを回避するために、javax.scene.table.cell.TextFieldTableCellおよびjavax.scene.table.cell.CellUtilsのソースをコピーすることを選択しました。TextFieldはCellUtilsでインスタンス化されるため、そこでカーソルの位置を修正できます。例えば

  static <T> TextField createTextField(final Cell<T> cell, final StringConverter<T> converter) {
    final TextField textField = new TextField(getItemText(cell, converter)) {
    private boolean first = true;

      @Override protected void layoutChildren() {
        super.layoutChildren();

        // Set cursor caret at end of text (and clear highlighting)
        if (first) {
          this.end();
          first = false;
        }
      };
  ...

  ...
  }


于 2020-04-13T20:59:31.200 に答える