2014-12-08 98 views
6

我在JavaFX 8中有一個只讀TableView,我不希望用戶選擇行。
他們應該仍然能夠對列進行排序並滾動,而不是選擇任何行。
我該如何做到這一點?在TableView中禁用行選擇

+0

從技術上講,您可以null selectionModel - 可能會禁用導航,雖然(現在不能嘗試)。另外,複製也是不可能的。好奇:你爲什麼想要減少用戶體驗? – kleopatra 2014-12-08 11:28:18

+1

@kleopatra將SelectionModel設置爲null將在用戶對列進行排序時引發異常。 – BioRoy 2014-12-09 12:54:11

+1

有用的知識,感謝信息:-)聽起來像一個bug(null selectionModel是一個有效的值),所以提出了一個問題:https://javafx-jira.kenai.com/browse/RT-39624 – kleopatra 2014-12-09 14:14:32

回答

7

經過一段時間,我發現如何解決它,所以張貼在這裏爲未來的用戶。
該解決方案是基於這樣的回答: JavaFX8 - Remove highlighting of selected row

加入以下幾行,以你的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 ; 
} 
4

我剛剛碰到這個問題。我認爲解決它的最好方法是提供一個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() { 

    } 
} 
+0

'isEmpty()'應該返回真實的恕我直言。 – Mordechai 2017-09-13 16:01:46

4

我發現here對於同樣的問題,但對於一個ListView另一種解決方案。模式是:監聽選擇更改事件,然後清除選擇。它也適用於TableView。 代碼示例:

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

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

    }); 
9

您可以禁用選擇,通過設置selectionModelnull

table.setSelectionModel(null); 
+3

這是不是在表中排序呢? – namlik 2016-05-19 06:54:57

+0

排序工作正常。 – user3224416 2016-05-22 08:57:51

+1

它與JavaFX 8的ListView引發我的任何方式來禁用選擇? – 2017-02-17 03:56:07