亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

TreeTableView:設置一行不可編輯

TreeTableView:設置一行不可編輯

郎朗坤 2021-10-13 16:12:28
我想根據樹中的級別控制 TreeTableView 某些行的樣式。setRowFactory如果此行是表根的第一級子級的一部分,我使用并應用了樣式。樣式工作正常,但我也想禁用單擊這些行的復選框。我能夠,setDisable(true)但這也禁用了 TreeItem 的擴展,并且SetEditable(false)似乎沒有任何效果。編輯:我的理解是必須將表設置為可編輯,然后列在默認情況下是可編輯的。但是如果我設置了,TreeTableRow.setEditable(true);或者TreeTableRow.setEditable(false);我從來沒有看到任何效果。setEditable 的描述似乎正是我想要的,但我無法那樣使用它。void javafx.scene.control.Cell.setEditable(boolean arg0)setEditable public final void setEditable(boolean value)允許某些單元格無法編輯。這在以下情況下很有用,例如,列表具有“標題行”-標題行 > 可編輯沒有意義,因此它們應該將可編輯設置為 false。參數:value - 表示單元格是否可編輯的布爾值。如果 >true,單元格可編輯,如果為 false,單元格不可編輯。主要的:public class TreeTableViewRowStyle extends Application {    public static void main(String[] args) {        launch(args);    }    @Override    public void start(Stage stage) throws Exception {        // create the treeTableView and colums        TreeTableView<Person> ttv = new TreeTableView<Person>();        TreeTableColumn<Person, String> colName = new TreeTableColumn<>("Name");        TreeTableColumn<Person, Boolean> colSelected = new TreeTableColumn<>("Selected");        colName.setPrefWidth(100);        ttv.getColumns().add(colName);        ttv.getColumns().add(colSelected);        ttv.setShowRoot(false);        ttv.setEditable(true);        // set the columns        colName.setCellValueFactory(new TreeItemPropertyValueFactory<>("name"));        colSelected.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colSelected));
查看完整描述

3 回答

?
呼啦一陣風

TA貢獻1802條經驗 獲得超6個贊

基本問題是,沒有任何可編輯(也不是像 CheckBoxXX 這樣的偽可編輯)樹/表單元格尊重它們所在行的可編輯性。我認為這是一個錯誤。


要克服這一問題,您必須擴展(偽)可編輯單元格并使它們尊重行的可編輯性。偽編輯單元格和真實編輯單元格的確切實現是不同的。以下是內嵌示例,對于頻繁使用,您可以將它們設為頂級并重復使用。


CheckBoxTreeTableCell:子類化并覆蓋 updateItem 以重新綁定其禁用的屬性,例如


colSelected.setCellFactory(c -> {

    TreeTableCell cell = new CheckBoxTreeTableCell() {


        @Override

        public void updateItem(Object item, boolean empty) {

            super.updateItem(item, empty);

            if (getGraphic() != null) {

                getGraphic().disableProperty().bind(Bindings

                        .not(

                              getTreeTableView().editableProperty()

                             .and(getTableColumn().editableProperty())

                             .and(editableProperty())

                             .and(getTreeTableRow().editableProperty())

                    ));

            }

        }


    };

    return cell;

});

對于真正的編輯單元格,fi TextFieldTreeTableCell: 覆蓋 startEdit 并返回,如果該行不可編輯,則不調用 super


colName.setCellFactory(c -> {

    TreeTableCell cell = new TextFieldTreeTableCell() {


        @Override

        public void startEdit() {

            if (getTreeTableRow() != null && !getTreeTableRow().isEditable()) return;

            super.startEdit();

        }


    };

    return cell;

});

現在你可以像你一樣切換行的可編輯性,稍微改變邏輯以保證在所有情況下完全清理:


ttv.setRowFactory(table-> {

    return new TreeTableRow<Person>(){

        @Override

        public void updateItem(Person pers, boolean empty) {

            super.updateItem(pers, empty);

            // tbd: check for nulls!

            boolean isTopLevel = table.getRoot().getChildren().contains(treeItemProperty().get());

            if (!isEmpty() && isTopLevel) {

                //                        if(isTopLevel){

                setStyle("-fx-background-color:lightgrey;");

                setEditable(false); 

            }else{

                setEditable(true);

                setStyle("-fx-background-color:white;");


            }

        }

    };

});


查看完整回答
反對 回復 2021-10-13
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

如果您想禁用特定的 Cell,則在 CellFactory 而不是 RowFactory 中處理禁用邏輯。TreeTableColumn(..)的靜態方法是一種方便快速使用的方法。但這不是唯一的方法。您仍然可以為 CheckBoxTreeTableCell 創建自己的工廠。


所以代替


colSelected.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(colSelected));

設置 cellfactory 如下,這應該適合你。


colSelected.setCellFactory(new Callback<TreeTableColumn<Person, Boolean>, TreeTableCell<Person, Boolean>>() {


    @Override

    public TreeTableCell<Person, Boolean> call(TreeTableColumn<Person, Boolean> column) {

        return new CheckBoxTreeTableCell<Person, Boolean>() {


            @Override

            public void updateItem(Boolean item, boolean empty) {

                super.updateItem(item, empty);

                boolean isTopLevel = column.getTreeTableView().getRoot().getChildren().contains(getTreeTableRow().getTreeItem());

                setEditable(!isTopLevel);

            }

        };

    }

});


查看完整回答
反對 回復 2021-10-13
  • 3 回答
  • 0 關注
  • 409 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號