当前位置: 首页 > 知识库问答 >
问题:

表格视图,设置可编辑单元格

郎鸿雪
2023-03-14

我尝试使表格单元格可编辑。我设法用两个包含字符串值的列来做到这一点,但我无法使用表示整数值的列来做到这一点。

带X的地方是编译器得到错误的地方:

The method setCellFactory(Callback<TableColumn<DataModel,Integer>,TableCell<DataModel,Integer>>) in the type TableColumn<DataModel,Integer> is not applicable for the arguments  (Callback<TableColumn<DataModel,String>,TableCell<DataModel,String>>)

带有 XX 的地方是编译器收到错误的地方:

The method setOnEditCommit(EventHandler<TableColumn.CellEditEvent<DataModel,Integer>>) in the type TableColumn<DataModel,Integer> is not applicable for the arguments ((CellEditEvent<DataModel, Integer> event) -> {})

代码如下:

public void initialize(URL location, ResourceBundle resources) {
    //Tworzymy sobie kolumny, które będą odpowiadać oraz przyjmować konretne dane
    TableColumn<DataModel, String> nameColumn = new TableColumn<DataModel, String>("Name");
    nameColumn.setMinWidth(100);
    TableColumn<DataModel, String> surnameColumn = new TableColumn<DataModel, String>("Surname");
    surnameColumn.setMinWidth(100);
    TableColumn<DataModel, Integer> ageColumn = new TableColumn<DataModel, Integer>("Age");
    ageColumn.setMinWidth(100);
    TableColumn<DataModel, Integer> telNumberColumn = new TableColumn<DataModel, Integer>("Tel. Number");
    telNumberColumn.setMinWidth(100);

    //dodajemy kolumny do okna
    tableView.getColumns().addAll(nameColumn,surnameColumn,ageColumn,telNumberColumn);

    //podajemy nazwy zmiennych, których wartości mają się wyświetlać w poszczególnych kolumnach
    nameColumn.setCellValueFactory(new PropertyValueFactory<>("sName"));
    surnameColumn.setCellValueFactory(new PropertyValueFactory<>("sSurname"));
    ageColumn.setCellValueFactory(new PropertyValueFactory<>("iAge"));
    telNumberColumn.setCellValueFactory(new PropertyValueFactory<>("iPhoneNumber"));

    //Sprawiamy że poszczególne kolumny stają się edytowalne
    nameColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn());
    nameColumn.setOnEditCommit((CellEditEvent<DataModel, String> event) -> {
        ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())).  setsName(event.getNewValue());
    });
    surnameColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn());
    surnameColumn.setOnEditCommit((CellEditEvent<DataModel, String> event) -> {
        ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())).  setsSurname(event.getNewValue());
    });
X   ageColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn());
XX  ageColumn.setOnEditCommit((CellEditEvent<DataModel, Integer> event) -> {
    //    ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())).  setiAge(Integer.valueOf(event.getNewValue()));

    });
X   telNumberColumn.setCellFactory(TextFieldTableCell.<DataModel>forTableColumn());
XX  telNumberColumn.setOnEditCommit((CellEditEvent<DataModel, Integer> event) -> {
 //         ((DataModel) event.getTableView().getItems(). get(event.getTablePosition().getRow())).  setiPhoneNumber(Integer.valueOf(event.getNewValue()));

    });

    tableView.setPlaceholder(new Label("Pust tabelka!"));//jaki element dodać jeśli tabelka nie jest wyświetlona
    tableView.setEditable(true);

    tableView.setItems(dataList); //wczytujemy dane do przygotowanej tabelki

    buttAdd.setOnAction((ActionEvent e) -> {
        buttAddAction(e);
    });
}

我正在学习oracle TableView教程,它相当困难。帮助。

共有2个答案

朱华皓
2023-03-14

我搜索了很多答案,我已经借用/扩展/合并到这个解决方案中。当焦点从编辑单元格移动时,会提交编辑。我为每个可以在表中表示的数据类型提供了一个公共类:EditingTextCell、EditingIntegerCell等。这些公共类可以应用于任何表,前提是数据表示为访问要显示为属性的数据的类的可观察列表。我发布这个解决方案是因为我面临着为应用程序中每个表的每一列创建一个类。目前,双精度值和组合框单元格版本绑定到特定表的特定列。如果时间允许,我会做这些的通用版本。请原谅我没有呈现源链接——我在阅读它们时忘记为它们添加书签了。

Java 留档表明,更简单的方法即将出现。

整数字段的示例用法:

    TableColumn<Factor, Number> noLevelsCol =
            new TableColumn<>("No. Levels");
    noLevelsCol.setCellValueFactory(
            new PropertyValueFactory("numberLevels"));
    noLevelsCol.setMinWidth(40);
    noLevelsCol.setCellFactory(col -> new EditingIntegerCell<>());
    noLevelsCol.setOnEditCommit((CellEditEvent<Factor, Number> t) -> {
        ((Factor) t.getTableView().getItems().get(
                t.getTablePosition().getRow())
                ).setNumberLevels(t.getNewValue().intValue());
    });

字符串字段的示例用法:

    TableColumn<Factor, String> nameCol = new TableColumn<>("Name");
    nameCol.setMinWidth(60);
    nameCol.setCellValueFactory(
          new PropertyValueFactory("factorName"));
    nameCol.setCellFactory(cellFactory);
    nameCol.setOnEditCommit((CellEditEvent<Factor, String> t) -> {
        ((Factor) t.getTableView().getItems().get(
                t.getTablePosition().getRow())
                ).setFactorName(t.getNewValue());
    });

因子类的定义:公共类因子{

private final IntegerProperty factorID = new SimpleIntegerProperty();
public IntegerProperty getFactorID() {     return factorID;    }

private StringProperty factorName = new SimpleStringProperty();
public void setFactorName(String value) {
           factorNameProperty().set(value); }
public String getFactorName() { return factorNameProperty().get(); }
public StringProperty factorNameProperty() { 
    if (factorName == null) factorName = 
        new SimpleStringProperty(this, "factorName");
    return factorName; 
}

private IntegerProperty numberLevels = new SimpleIntegerProperty();
public void setNumberLevels(int value) {
         numberLevelsProperty().set(value); }
public IntegerProperty getNumberLevels() { return numberLevels;    }
public IntegerProperty numberLevelsProperty() { 
    if (numberLevels == null) numberLevels =
          new SimpleIntegerProperty(this, "numberLevels");
    return numberLevels; 
}

private StringProperty listOfLevels = new SimpleStringProperty();
public void setListOfLevels(String value) {
         listOfLevelsProperty().set(value); }
public String getListOfLevels() { return listOfLevelsProperty().get(); }
public StringProperty listOfLevelsProperty() { 
    if (listOfLevels == null) listOfLevels = 
          new SimpleStringProperty(this, "listOfLevels");
    return listOfLevels; 
}


// Constructors
public Factor(int factorID, String factorName) {
    this.factorID.set(factorID);
    this.factorName.set(factorName);
    this.numberLevels.set(1);
    this.listOfLevels.set("-1, 1");
}

public Factor(int factorID, String factorName, int numberLevels,
                String listOfLevels) {
    this.factorID.set(factorID);
    this.factorName.set(factorName);
    this.numberLevels.set(numberLevels);
    this.listOfLevels.set(listOfLevels);
}

@Override
public String toString() {
    return "Factor{" + "factorName=" + factorName + '}';
}

public String[] getLevels() {
    return listOfLevels.getValue().split(",");
}

}

将数据加载到表中最终的 ObservableList factorList = FXCollections.observableArrayList( new Factor(1, “Factor1”, 2, “-1, 1”) );

    factorTableView.setEditable(true);
    factorTableView.getColumns().clear();
    factorTableView.setItems(factorList);
    boolean addAll;
    addAll = factorTableView.getColumns().addAll(idCol,
                   nameCol, noLevelsCol, levelsCol);

EditingIntegerCell类公共类EditingIntegerCell扩展TableCell {

    private TextField textField;
    private final Pattern intPattern = Pattern.compile("-?\\d+");

    public EditingIntegerCell() {
    }

    @Override
    public void startEdit() {
        if (!isEmpty()) {
            super.startEdit();
            createTextField();
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();

        setText((String) getItem().toString());
        setGraphic(null);
    }

    @Override
    public void updateItem(Number item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }
    }

    private void createTextField() {
        textField = new TextField(getString());
        textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
        textField.focusedProperty().addListener(
            (ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) 
                        -> {
            if (!arg2) {
                processEdit();
            }
        });
    }

    private void processEdit() {
        String text = textField.getText();
        if (intPattern.matcher(text).matches()) {
            commitEdit(Integer.parseInt(text));
        } else {
            cancelEdit();
        }
    }

    private String getString() {
        return getItem() == null ? "" : getItem().toString();
    }
}

** EditingTextCell类* *公共类editing textcell扩展TableCell {

    private TextField textField;

    public EditingTextCell() {
    }

    @Override
    public void startEdit() {
        if (!isEmpty()) {
            super.startEdit();
            createTextField();
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }
    }

    @Override
    public void cancelEdit() {
        super.cancelEdit();

        setText((String) getItem());
        setGraphic(null);
    }

    @Override
    public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);

        if (empty) {
            setText(null);
            setGraphic(null);
        } else {
            if (isEditing()) {
                if (textField != null) {
                    textField.setText(getString());
                }
                setText(null);
                setGraphic(textField);
            } else {
                setText(getString());
                setGraphic(null);
            }
        }
    }

    private void createTextField() {
        textField = new TextField(getString());
        textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()* 2);
        textField.focusedProperty().addListener(
            (ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) 
                        -> {
            if (!arg2) {
                commitEdit(textField.getText());
            }
        });
    }

    private String getString() {
        return getItem() == null ? "" : getItem();
    }
}
笪健
2023-03-14

问题是TextFieldTableCell.forTableCollie()被键入为字符串值。请参阅默认实现:

public static <S> Callback<TableColumn<S,String>, TableCell<S,String>> forTableColumn() {
    return forTableColumn(new DefaultStringConverter());
}

您需要的是带有< code > IntegerStringConverter 的< code>TextFieldTableCell,例如:

ageColumn.setCellFactory(TextFieldTableCell.<DataModel, Integer>forTableColumn(new IntegerStringConverter()));
 类似资料:
  • 问题内容: 我正在尝试用Java编写程序来管理我的Bookie帐户。我是java的新手,所以我认为我会选择一些简单的方法来了解事情的原理。我决定使用表格视图并使各个单元格可编辑。我一直在关注本教程http://java- buddy.blogspot.co.uk/2012/04/javafx-2-editable-tableview.html 。它详细说明了如何使用Java代码执行此操作,并将其复

  • 我正在 中使用 现在我遇到了表视图单元格高度的问题。我正在聊天屏幕上工作,所以我有文字,图像。所以我在管理屏幕的其中取了一个原型单元。现在下面是我的身高代码 因此,文本单元格没有得到我所期望的,但我不知道我的错误在哪里,还有一件事,如果我< code > returnuitableviewautomaticdimension ,它的工作很好的文本信息,而不是图像。请帮助我,先谢了。

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

  • 我有一个表视图,其中很少有列是可编辑的,也很少有不可编辑的。当我在第一列中输入一些值并按tab键时,将调用一个服务,返回的对象将映射到表行。我的要求是根据返回对象中的标志将不可编辑列设置为可编辑(仅在我编辑过的行中)。下面是调用服务并将返回的对象设置为行的代码。 请建议如何在运行时根据标志将不可编辑的列转换为可编辑的列。

  • 我希望我的swift代码在每次按下按钮时都添加一个新的tableview单元格。你可以在下面的gif中看到我想要的东西。这段代码应该在func-tableView(_tableView:UITableView,cellForRowAt-indexPath:indexPath)中添加按钮- 在此输入图像描述

  • 本文向大家介绍element-ui 表格实现单元格可编辑的示例,包括了element-ui 表格实现单元格可编辑的示例的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇element-ui 表格实现单元格可编辑的示例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 问题内容: 有什么办法可以在jtable中动态制作不可编辑的单元格吗?每当用户提供类似false的输入时,我都想创建不可编辑的单元格…我已经在DefaultTableModel isCellEditable方法中看到过,但是如果我想使用它,则每次创建新对象时都会创建它,因此我想动态更改它为不可编辑。有人可以帮我吗?。谢谢 问题答案: 其他班级 然后,您可以通过使用存储的myModel变量并在其上调

  • 问题内容: 嗨,我正在使用GXT 2.2.3创建可编辑网格。我创建了如下列: 现在,我想根据eventCombo框值的值,将checkinDate,CheckIntime,CheckOutDate和CheckOutTime列单元格设置为不可编辑或禁用。 如何在eventCombo的侦听器框中进行此操作。请提出建议。 我是GXT的新手。 更新 我尝试了下面的代码来禁用和启用单元格,但是它禁用了单元格