JavaFX TableView-无法编辑

JavaFX TableView-无法编辑,java,tableview,javafx-2,Java,Tableview,Javafx 2,我正在尝试使用表视图上的编辑功能。 我将此图坦卡蒙用作参考: 但是我正在使用FXML文件进行创建(使用JavaFX场景生成器)。 我已选中表和列的可编辑复选框(在场景生成器中),但如果执行该程序,则无法编辑值。我已经从图坦卡蒙下载了示例项目和编辑作品。。。因此,在我的项目中,TextField不会被打开:( 控制员: public class StatesPopupController implements Controllerable, Initializable { // <e

我正在尝试使用
表视图上的编辑功能
。 我将此图坦卡蒙用作参考: 但是我正在使用FXML文件进行创建(使用JavaFX场景生成器)。 我已选中表和列的可编辑复选框(在场景生成器中),但如果执行该程序,则无法编辑值。我已经从图坦卡蒙下载了示例项目和编辑作品。。。因此,在我的项目中,
TextField
不会被打开:( 控制员:

public class StatesPopupController implements Controllerable, Initializable {
    // <editor-fold desc="fxml import stuff" defaultstate="collapsed">
    @FXML //  fx:id="guiStatesTable"
    private TableView<StateData> guiStatesTable; // Value injected by FXMLLoader
    @FXML //  fx:id="guiColorColumn"
    private TableColumn<StateData, String> guiColorColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiFontEffectColumn"
    private TableColumn<StateData, String> guiFontEffectColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiUseColumn"
    private TableColumn<StateData, String> guiUseColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiValueColumn"
    private TableColumn<StateData, String> guiValueColumn; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddColor"
    private TextField guiStateAddColor; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddFontEffect"
    private TextField guiStateAddFontEffect; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddUse"
    private TextField guiStateAddUse; // Value injected by FXMLLoader
    @FXML //  fx:id="guiStateAddValue"
    private TextField guiStateAddValue; // Value injected by FXMLLoader
// </editor-fold>

    private Modelable model = null;

    public StatesPopupController() {
        this.model = new StatesPopupModel();
    }

    @Override
    public Modelable getModel() {
        return model;
    }

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        this.guiStatesTable.setEditable(true);
        this.guiValueColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("value"));
        this.guiColorColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("color"));
        this.guiUseColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("use"));
        this.guiFontEffectColumn.setCellValueFactory(new PropertyValueFactory<StateData, String>("fontEffect"));
        this.guiStatesTable.setItems(((StatesPopupModel)this.model).getTableData());
    }

    public void newAddBtnEvent(ActionEvent event {
        ((StatesPopupModel)this.model).addDataEntry(guiStateAddValue.getText(), guiStateAddColor.getText(), guiStateAddUse.getText(), guiStateAddFontEffect.getText());
        guiStateAddValue.clear();
        guiStateAddColor.clear();
        guiStateAddUse.clear();
        guiStateAddFontEffect.clear();
        this.guiStatesTable.setItems(((StatesPopupModel) this.model).getTableData());
    }

    public void newEditValueEvent(CellEditEvent<StateData, String> event) {

        ((StateData)event.getTableView().getItems().get(event.getTablePosition().getRow())).setValue(event.getNewValue());
    }

    public void newEditColorEvent(ActionEvent event) {
        System.out.print("asd");
    }

    public void newEditUseEvent(ActionEvent event) {}

    public void newEditFontEffectEvent(ActionEvent event) {}
}
这里是fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" minHeight="397.0" minWidth="264.0" prefHeight="397.0" prefWidth="427.0" xmlns:fx="http://javafx.com/fxml" fx:controller="controller.popup.StatesPopupController">
  <children>
    <Label text="States" AnchorPane.leftAnchor="14.0" AnchorPane.topAnchor="6.0">
      <font>
        <Font name="System Bold" size="15.0" />
      </font>
    </Label>
    <TableView fx:id="guiStatesTable" editable="true" prefHeight="311.0" prefWidth="236.0" AnchorPane.bottomAnchor="52.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="34.0">
      <columns>
        <TableColumn prefWidth="75.0" text="Value" fx:id="guiValueColumn" />
        <TableColumn prefWidth="75.0" text="Color" fx:id="guiColorColumn" />
        <TableColumn prefWidth="75.0" text="Use" fx:id="guiUseColumn" />
        <TableColumn prefWidth="75.0" text="fontEffect" fx:id="guiFontEffectColumn" />
      </columns>
    </TableView>
    <HBox id="HBox" alignment="CENTER" prefWidth="236.0" spacing="5.0" AnchorPane.bottomAnchor="17.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0">
      <children>
        <TextField fx:id="guiStateAddValue" prefWidth="93.0" promptText="Value" />
        <TextField fx:id="guiStateAddColor" prefWidth="79.0" promptText="Color" />
        <TextField fx:id="guiStateAddUse" prefWidth="79.0" promptText="Use" />
        <TextField fx:id="guiStateAddFontEffect" prefWidth="79.0" promptText="Font Effect" />
        <Button mnemonicParsing="false" onAction="#newAddBtnEvent" text="Add" />
      </children>
    </HBox>
  </children>
</AnchorPane>
我得到这个错误:

error: method setCellFactory in class TableColumn<S,T> cannot be applied to given types;
    guiUseColumn.setCellFactory(TextFieldTableCell.forTableColumn());
                ^
  required: Callback<TableColumn<StateData,String>,TableCell<StateData,String>>
  found: Callback<TableColumn<Object,String>,TableCell<Object,String>>
  reason: actual argument Callback<TableColumn<Object,String>,TableCell<Object,String>> cannot be converted to Callback<TableColumn<StateData,String>,TableCell<StateData,String>> by method invocation conversion
  where S,T are type-variables:
    S extends Object declared in class TableColumn
    T extends Object declared in class TableColumn
错误:类TableColumn中的方法setCellFactory无法应用于给定类型;
guiUseColumn.setCellFactory(TextFieldTableCell.forTableColumn());
^
必需:回调
找到:回调
原因:无法通过方法调用转换将实际参数回调转换为回调
其中S、T是类型变量:
S扩展类TableColumn中声明的对象
T扩展类TableColumn中声明的对象

要使
表格视图
可编辑,还应提供一个
CellFactory
,它将处理编辑控件的创建

您可以在此处找到本教程的相应部分:

尝试以下内容:

....setCellFactory(TextFieldTableCell.<StateData>forTableColumn());
…setCellFactory(TextFieldTableCell.forTableColumn());

我也有同样的问题,我没有找到一个合适的解决方案,将FXML视图和控制器分开。我还想继续使用这个模型。上面提到的示例对我不起作用。所以我稍微修改了一下

该解决方案包括一个自定义的
TableCellFactory
。需要将
TableCell
更改为
TextFieldTableCell
,并添加以下内容:

cell.setConverter(new StringConverter<T>() {
            @Override
            public String toString(T object) {
                return object.toString();
            }
            @Override
            public T fromString(String string) {
                return (T) string;
            }
        });
cell.setConverter(新的StringConverter(){
@凌驾
公共字符串toString(T对象){
返回object.toString();
}
@凌驾
公共T fromString(字符串){
返回(T)字符串;
}
});
控制器中有处理更改的新方法

@FXML
protected void changeFirstName(CellEditEvent<Person, String> event) {
    ((Person) event.getTableView().getItems().get(event.getTablePosition().getRow())).setFirstName(event.getNewValue());
}
@FXML
受保护的void changeFirstName(CellEditEvent事件){
((Person)event.getTableView().getItems().get(event.getTablePosition().getRow()).setFirstName(event.getNewValue());
}
引用位于FXML文件中

<TableColumn fx:id="firstNameColumn" text="First Name" prefWidth="100" onEditCommit="#changeFirstName">


您可以在my中找到完整的更改。

我不明白。这个笨蛋只是没有打开TextField IM,它有完全相同的问题。问题似乎是TextFieldTableCell.forTableColumn()使用泛型,因为方法签名如下:public static Callback forTableColumn()我还没有弄明白如何调用使用泛型的静态方法。是的,我也试过了。但是我遇到了这个错误:(见主帖子)你知道如何解决这个问题吗?我用给定的参数创建了一个新的回调,它现在可以工作了!谢谢。@immerhart发布你提出的解决方案比接受一个没有为你提供解决方案的答案更能帮助SO社区。
cell.setConverter(new StringConverter<T>() {
            @Override
            public String toString(T object) {
                return object.toString();
            }
            @Override
            public T fromString(String string) {
                return (T) string;
            }
        });
@FXML
protected void changeFirstName(CellEditEvent<Person, String> event) {
    ((Person) event.getTableView().getItems().get(event.getTablePosition().getRow())).setFirstName(event.getNewValue());
}
<TableColumn fx:id="firstNameColumn" text="First Name" prefWidth="100" onEditCommit="#changeFirstName">