【问题标题】:Editing TableView in JavaFX在 JavaFX 中编辑 TableView
【发布时间】:2014-10-14 09:03:09
【问题描述】:

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

我尝试将代码放入初始化方法中,该方法在没有 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);
}

【问题讨论】:

  • 听起来您不明白如何与场景生成器以编程方式(在普通 java 代码中)创建的 FXML 中定义的 JavaFX 组件进行交互?这是正确的吗?
  • 我知道如何与JavaFX组件交互,但我不知道如何创建一个函数式方法setOnEditCommit。
  • 你能发布一些代码来展示你的尝试吗?

标签: java javafx tableview tablecolumn


【解决方案1】:

我发现了错误。

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

【讨论】:

  • 你能澄清一下吗?我实际上遇到了同样的问题。你的措辞留下了模棱两可的余地。
  • 我的程序现在可以正常工作了:) 错误:我在 TableView 的 setEditable 上没有“true”..
【解决方案2】:

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

【讨论】:

  • 感谢您的回复,但我已经有了控制器类。在 SceneBuilder 中为按钮设置的方法有效,但设置为“setOnEditCommit”的方法不起作用。我的意思是初始化方法在控制器中。
  • 查看“提交”编辑的内容。我的猜测是您需要使用其他方法之一,例如按键侦听器侦听“输入”键或其他触发“提交”的方法。
  • 我在哪里可以找到触发“提交”的内容?方法 setOnEditCommit 应该触发点击该值。在没有 SceneBuilder 的 JavaFX 应用程序中就是这样。
  • 您使用的是 IDE 吗?尝试“查找用法”或类似的东西。与往常一样,如有疑问,请查看该方法的文档。
  • 是的,我使用 Netbeans。而且在Oracle的文档中写的不多。。我不知道我在哪里找到答案,所以我在这里写。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-10-19
  • 2012-10-05
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
相关资源
最近更新 更多