1

アプリケーションに 2 つの tableView があり、一度に 1 つだけを有効にしたいと考えています。

たとえば、私はtableView1とtableView2を持っています

tableView2 が選択されている (またはフォーカスされている) 場合、tableView1 は選択をクリアします。

いくつかのコードを試しましたが、うまくいかないようです。

mainTableView2.focusModelProperty().addListener(new ChangeListener() {

            @Override
            public void changed(ObservableValue ov, Object t, Object t1) {
                mainTableView1.getSelectionModel().clearSelection();
            }
        });
4

1 に答える 1

4

このサンプルでは、​​リスナーを間違って割り当てています。あなたが書いた:

mainTableView2.focusModelProperty().addListener(new ChangeListener() {

        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {
            mainTableView1.getSelectionModel().clearSelection();
        }
    });

これは、TableView がフォーカスされたアイテムまたはセルを変更する戦略を持っていることを意味します。これにより、プログラムでフォーカスを変更したり、フォーカスされたアイテムを追跡したりできます...そして、その戦略を変更する際にリスナーを追加しますが、実際には通常は変更されません。テーブルのフォーカスされた項目を追跡する場合は、そのフォーカス モデルのプロパティにリスナーを追加する必要があります。

必要なものは次のようになります。

mainTableView2.focusedProperty().addListener(new ChangeListener() {

        @Override
        public void changed(ObservableValue ov, Object t, Object t1) {
            mainTableView1.getSelectionModel().clearSelection();
        }
    });

このプロパティ (フォーカスされたプロパティ) は、コントロールのフォーカスされた状態に応答します (青い境界線 - カスピアン スタイルの場合、およびモデナ スタイルの場合は赤い境界線)。

しかし、評価中に、バグがあることがわかったので(コメントを参照)、その問題の回避策を提案します:

    scene.focusOwnerProperty().addListener(new ChangeListener<Node>() {
        @Override
        public void changed(ObservableValue<? extends Node> ov, Node t, Node t1) {

            if (t1 == table2) {
                table1.getSelectionModel().clearSelection();
            }
            if (t1 == table1) {
                table2.getSelectionModel().clearSelection();
            }
        }
    });

同様のロジックをそこに貼り付けます..

于 2013-02-19T20:09:46.180 に答える