web-dev-qa-db-ja.com

TableViewで行選択を無効にする

JavaFX 8に読み取り専用のTableViewがあり、ユーザーに行を選択させたくありません。
行を選択するのではなく、列を並べ替えてスクロールできるはずです。
どうすればこれを達成できますか?

11
BioRoy

しばらくして、それを解決する方法を見つけたので、将来のユーザーのためにここに投稿してください。
解決策は次の回答に基づいています: JavaFX8-選択した行の強調表示を削除

次の行をcssに追加すると、選択した行は選択されていない行とまったく同じように見え、同じ場所で必要な同じ効果が得られます。

.table-row-cell:filled:selected { 
  -fx-background: -fx-control-inner-background ;
  -fx-background-color: -fx-table-cell-border-color, -fx-background ;
  -fx-background-insets: 0, 0 0 1 0 ;
  -fx-table-cell-border-color: derive(-fx-color, 5%);
}
.table-row-cell:odd:filled:selected {
  -fx-background: -fx-control-inner-background-alt ;
}
12
BioRoy

selectionModelnullに設定すると、選択を無効にできます。

table.setSelectionModel(null);
13
user3224416

私はこの問題に自分でぶつかったところです。それを解決する最善の方法は、TableViewSelectionModelのnull実装を提供することだと思います。

次に、単にtableView.setSelectionModel(new NullTableViewSelectionModel(tableView));と言うことができます

Null実装のサンプルを以下に示します...

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TablePosition;
import javafx.scene.control.TableView;

public class NullTableViewSelectionModel extends TableView.TableViewSelectionModel {

    public NullTableViewSelectionModel(TableView tableView) {
        super(tableView);
    }

    @Override
    public ObservableList<TablePosition> getSelectedCells() {
        return FXCollections.emptyObservableList();
    }

    @Override
    public void selectLeftCell() {

    }

    @Override
    public void selectRightCell() {

    }

    @Override
    public void selectAboveCell() {

    }

    @Override
    public void selectBelowCell() {

    }

    @Override
    public void clearSelection(int i, TableColumn tableColumn) {

    }

    @Override
    public void clearAndSelect(int i, TableColumn tableColumn) {

    }

    @Override
    public void select(int i, TableColumn tableColumn) {

    }

    @Override
    public boolean isSelected(int i, TableColumn tableColumn) {
        return false;
    }

    @Override
    public ObservableList<Integer> getSelectedIndices() {
        return FXCollections.emptyObservableList();
    }

    @Override
    public ObservableList getSelectedItems() {
        return FXCollections.emptyObservableList();
    }

    @Override
    public void selectIndices(int i, int... ints) {

    }

    @Override
    public void selectAll() {

    }

    @Override
    public void clearAndSelect(int i) {

    }

    @Override
    public void select(int i) {

    }

    @Override
    public void select(Object o) {

    }

    @Override
    public void clearSelection(int i) {

    }

    @Override
    public void clearSelection() {

    }

    @Override
    public boolean isSelected(int i) {
        return false;
    }

    @Override
    public boolean isEmpty() {
        return false;
    }

    @Override
    public void selectPrevious() {

    }

    @Override
    public void selectNext() {

    }

    @Override
    public void selectFirst() {

    }

    @Override
    public void selectLast() {

    }
}
5
Phil Anderson

私は ここ 同じ問題の別の解決策を見つけましたが、ListViewです。パターンは次のとおりです。選択変更イベントをリッスンしてから、選択をクリアします。 TableViewでも機能します。コード例:

    _tableView.getSelectionModel()
               .selectedIndexProperty()
               .addListener((observable, oldvalue, newValue) -> {

        Platform.runLater(() -> {
            _tableView.getSelectionModel().clearSelection();
        });

    });
4
tino