当前位置: 首页 > 面试题库 >

TreeTableView:设置行不可编辑

华乐逸
2023-03-14
问题内容

我想控制基于树中级别的TreeTableView的某些行的样式。setRowFactory如果此行是Table根目录的第一级子级的一部分,则使用并应用样式。样式工作正常,但我也想禁用这些行的复选框。我能够,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)

允许某些单元格无法进行编辑。这在以下情况下很有用:例如,列表具有“标题行”-标题行不可编辑是没有意义的,因此它们应将editable设置为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));
        colSelected.setCellValueFactory(new TreeItemPropertyValueFactory<>("selected"));

        ttv.setRowFactory(table-> {
            return new TreeTableRow<Person>(){
                @Override
                public void updateItem(Person pers, boolean empty) {
                    super.updateItem(pers, empty);
                    boolean isTopLevel = table.getRoot().getChildren().contains(treeItemProperty().get());
                    if (!isEmpty()) {
                        if(isTopLevel){
                            setStyle("-fx-background-color:lightgrey;");
                            setEditable(false); //THIS DOES NOT SEEM TO WORK AS I WANT
                            //setDisable(true); //this would disable the checkbox but also the expanding of the tree
                        }else{                              
                            setStyle("-fx-background-color:white;");
                        }
                    }
                }
            };
        });


        // creating treeItems to populate the treetableview
        TreeItem<Person> rootTreeItem = new TreeItem<Person>();
        TreeItem<Person> parent1 = new TreeItem<Person>(new Person("Parent 1"));
        TreeItem<Person> parent2 = new TreeItem<Person>(new Person("Parent 1"));
        parent1.getChildren().add(new TreeItem<Person>(new Person("Child 1")));
        parent2.getChildren().add(new TreeItem<Person>(new Person("Child 2")));
        rootTreeItem.getChildren().addAll(parent1,parent2);


        ttv.setRoot(rootTreeItem);

        // build and show the window
        Group root = new Group();
        root.getChildren().add(ttv);
        stage.setScene(new Scene(root, 300, 300));
        stage.show();
    }
}

模特儿

public class Person {
    private StringProperty name;
    private BooleanProperty selected;

    public Person(String name) {
        this.name = new SimpleStringProperty(name);
        selected = new SimpleBooleanProperty(false);
    }

    public StringProperty nameProperty() {
        return name;
    }

    public BooleanProperty selectedProperty() {
        return selected;
    }

    public void setName(String name){
        this.name.set(name);
    }

    public void setSelected(boolean selected){
        this.selected.set(selected);
    }
}

问题答案:

基本的问题是,所有可编辑的树/表格单元格(或类似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;");

            }
        }
    };
});


 类似资料:
  • 问题内容: 如果我想将cq5组件设置为在A页中可编辑但在B页中不可编辑,是否可以。 例如:在A页上,我有C组件,我们允许作者打开对话框并编辑该组件。但是我们不允许作者打开对话框来编辑页面B上的组件C。我尝试研究cq:EditConfig 链接,但这还不足以解决我的问题。 问题答案: 您可以在包含之前设置ComponentContext.BYPASS_COMPONENT_HANDLING_ON_IN

  • 问题内容: 我正在使用创建时间选择器。内的文字是可编辑的。但我想将设置为不可编辑,因为有机会给出无效的值。谁能帮我? 问题答案: 请尝试以下操作: 只要您自己没有通过调用更改微调器编辑器,此方法就应该起作用。 告诉我们这是否有帮助。

  • 我有一个剑道网格,根据第一列中的值,COR ABA编号可以编辑也可以不编辑。因此,如果NOC代码=='C01',则COR ABA编号可编辑,否则不可编辑。 我通过在列和编辑处理程序中添加编辑事件来实现这一点,在不允许编辑的情况下,禁用HTML输入Kendo创建。(在栅格定义中,我有可编辑(true)开始)。我希望通过在网格的数据绑定事件中执行逻辑检查来实现这一点。也就是说,在绑定所有数据后,迭代数

  • 本文向大家介绍PyQt5 QTableView设置某一列不可编辑的方法,包括了PyQt5 QTableView设置某一列不可编辑的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 写一个代理。 设置一下就可以了。 以上这篇PyQt5 QTableView设置某一列不可编辑的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有一个页面,需要在自定义portlet中为用户设置并分配站点角色。因此,我能够在一个列表中获取“用户现有角色”,并在另一个列表中获取所有“可用站点角色”。那么,我该如何对分配给用户的行进行调整或任何验证,以使其不可编辑。比方说(我们有四个站点类型的角色,即站点管理员、站点所有者、站点成员和站点内容审阅者,现在相应的用户已经分配了站点管理员角色。因此,现在在搜索容器行中,我需要将站点管理员行设置为

  • 本文向大家介绍vue 设置 input 为不可以编辑的实现方法,包括了vue 设置 input 为不可以编辑的实现方法的使用技巧和注意事项,需要的朋友参考一下 我用最笨的方法,先实现功能先,用两个input,一个可以编辑,一个不可以编辑,失去焦点后隐藏可以点击的那个,点“编辑”时,显示可以编辑的那个input 以上这篇vue 设置 input 为不可以编辑的实现方法就是小编分享给大家的全部内容了,