繁体   English   中英

在 JavaFX 中编辑 TableView

[英]Editing TableView in JavaFX

有谁知道如何更改TableView中的值? 我是用 SceneBuilder 开发的,所以恐怕任何没有 SceneBuilder 的教程都帮不了我。

我试图将代码放入 initialize 方法中,该方法在没有 SceneBuilder 的程序中工作。 我还尝试在 SceneBuilder 中设置一个方法“setOnEditCommit”,但即使单击 TableColumn 中的一行,该方法也没有启动。

编辑:

我在方法初始化中尝试了这个:

@Override
public void initialize(URL url, ResourceBundle rb) {
    ...
    //initialize TableViewu
    javafx.util.Callback<TableColumn, TableCell> cellFactory = new javafx.util.Callback<TableColumn, TableCell>() {
        @Override
        public TableCell call(TableColumn p) {
            return new EditingCell();
        }
    };
    vesniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("vesnice"));
    souradniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("souradnice"));
    pocetTableColumn.setEditable(true);
    pocetTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, Integer>("pocet"));
    pocetTableColumn.setCellFactory(cellFactory);
    pocetTableColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Cil, Integer>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Cil, Integer> t) {
            ((Cil) t.getTableView().getItems().get(t.getTablePosition().getRow())).setPocet(t.getNewValue());
        }
    });
    tableView.setItems(cilVesnice);
}

或者

@Override
public void initialize(URL url, ResourceBundle rb) {
    ...
    //initialize TableViewu
    vesniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("vesnice"));
    souradniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("souradnice"));
    pocetTableColumn.setEditable(true);
    pocetTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, Integer>("pocet"));
    pocetTableColumn.setCellFactory(TextFieldTableCell.<Cil, Integer>forTableColumn(new IntegerStringConverter()));
    pocetTableColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Cil, Integer>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Cil, Integer> t) {
            ((Cil) t.getTableView().getItems().get(t.getTablePosition().getRow())).setPocet(t.getNewValue());
        }
    });
    tableView.setItems(cilVesnice);
}

我发现了错误。

我忘了将 TableView 设置为可编辑。 TableView 上的setEditable(true)解决了这个问题。

您需要创建一个控制器类。 在场景构建器中,您需要在场景构建器(左下角)中单击控制器,然后键入您将创建的控制器类的名称。 然后,单击“查看”,然后单击“示例控制器骨架”。 将其复制到与您在控制器窗格中设置的名称相同的 java 类中。

我在初始化方法中尝试了这个:

@Override
public void initialize(URL url, ResourceBundle rb) {
    ...
    //initialize TableViewu
    javafx.util.Callback<TableColumn, TableCell> cellFactory = new javafx.util.Callback<TableColumn, TableCell>() {
        @Override
        public TableCell call(TableColumn p) {
            return new EditingCell();
        }
    };
    vesniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("vesnice"));
    souradniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("souradnice"));
    pocetTableColumn.setEditable(true);
    pocetTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, Integer>("pocet"));
    pocetTableColumn.setCellFactory(cellFactory);
    pocetTableColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Cil, Integer>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Cil, Integer> t) {
            ((Cil) t.getTableView().getItems().get(t.getTablePosition().getRow())).setPocet(t.getNewValue());
        }
    });
    tableView.setItems(cilVesnice);
}

要么

@Override
public void initialize(URL url, ResourceBundle rb) {
    ...
    //initialize TableViewu
    vesniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("vesnice"));
    souradniceTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, String>("souradnice"));
    pocetTableColumn.setEditable(true);
    pocetTableColumn.setCellValueFactory(new PropertyValueFactory<Cil, Integer>("pocet"));
    pocetTableColumn.setCellFactory(TextFieldTableCell.<Cil, Integer>forTableColumn(new IntegerStringConverter()));
    pocetTableColumn.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<Cil, Integer>>() {
        @Override
        public void handle(TableColumn.CellEditEvent<Cil, Integer> t) {
            ((Cil) t.getTableView().getItems().get(t.getTablePosition().getRow())).setPocet(t.getNewValue());
        }
    });
    tableView.setItems(cilVesnice);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM