Javafx 2 tableCoulmn won';不要在编辑提交时触发

Javafx 2 tableCoulmn won';不要在编辑提交时触发,javafx-2,fxml,scenebuilder,Javafx 2,Fxml,Scenebuilder,我试图使用javaFX Scene builder创建一个可编辑的表,但我无法让它触发编辑提交事件,编辑单元格(以enter input结束)后,输入框变为空白,但仍然覆盖单元格,直到我通过选择它并按esc关闭它为止 我的控制器的代码如下所示: public class PlaylistsWindowController extends AbstractController implements EventHandler<WindowEvent> { private Set

我试图使用javaFX Scene builder创建一个可编辑的表,但我无法让它触发编辑提交事件,编辑单元格(以enter input结束)后,输入框变为空白,但仍然覆盖单元格,直到我通过选择它并按esc关闭它为止

我的控制器的代码如下所示:

public class PlaylistsWindowController extends AbstractController implements EventHandler<WindowEvent> {

    private Set<Song> libary;
    private final ObservableList<SongWraper> libaryTableData = FXCollections.observableArrayList();
    private final String LIBADRESS = "data\\libary.sav";

    @FXML
    TableColumn<SongWraper, String> titleColumn;

    @FXML
    TableColumn<SongWraper, String> artistColumn;

    @FXML
    TableColumn<SongWraper, String> genreColumn;

    @FXML
    TableColumn<SongWraper, String> serieColumn;

    @FXML
    TableColumn<SongWraper, Integer> pointGainColumn;

    @FXML
    TableColumn<SongWraper, Integer> pointLossColumn;

    @FXML
    TableView<SongWraper> libaryTable;

    @Override
    public void initialize(URL arg0, ResourceBundle arg1) {

        /*Code creating the libaryTableData*/


        configLibaryTable();
    }

    private void configLibaryTable(){
        titleColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, String>("title"));
        artistColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, String>("artistName"));
        serieColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, String>("serieName"));
        genreColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, String>("genre"));
        pointGainColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, Integer>("pointGain"));
        pointLossColumn.setCellValueFactory(new PropertyValueFactory<SongWraper, Integer>("pointLossColumn"));
        libaryTable.setItems(libaryTableData);
        libaryTable.setEditable(true);
        libaryTableEditCommit();
    }

    private void libaryTableEditCommit(){
        titleColumn.setCellFactory(TextFieldTableCell.<SongWraper>forTableColumn());
        titleColumn.setOnEditCommit(
                new EventHandler<TableColumn.CellEditEvent<SongWraper, String>>(){
                    @Override
                    public void handle(CellEditEvent<SongWraper, String> t){
                        ((SongWraper) t.getTableView().getItems().get(t.getTablePosition().getRow())
                                ).setTitle(t.getNewValue());
                    }
                }
                );
    }
公共类控制器扩展AbstractController实现EventHandler{
私人图书馆;
private final ObservableList libaryTableData=FXCollections.observableArrayList();
私有最终字符串libaddress=“data\\libary.sav”;
@FXML
表柱滴定柱;
@FXML
表格栏目艺术家栏目;
@FXML
表列根;
@FXML
表柱系列柱;
@FXML
TableColumn pointGainColumn;
@FXML
TableColumn pointLossColumn;
@FXML
TableView-libaryTable;
@凌驾
公共void初始化(URL arg0,ResourceBundle arg1){
/*创建libaryTableData的代码*/
configLibaryTable();
}
私有void configLibaryTable(){
titleColumn.setCellValueFactory(新属性值工厂(“标题”);
artistColumn.setCellValueFactory(新属性ValueFactory(“artistName”));
serieColumn.setCellValueFactory(新属性ValueFactory(“serieName”));
genreclumn.setCellValueFactory(新属性值工厂(“流派”);
pointGainColumn.setCellValueFactory(新属性ValueFactory(“pointGain”));
pointLossColumn.setCellValueFactory(新的PropertyValueFactory(“pointLossColumn”));
setItems(libaryTableData);
libaryTable.setEditable(true);
libaryTableEditCommit();
}
私有void libaryTableEditCommit(){
titleColumn.setCellFactory(TextFieldTableCell.forTableColumn());
titleColumn.setOnEditCommit(
新的EventHandler(){
@凌驾
公共无效句柄(CellEditEvent t){
((Songwrapper)t.getTableView().getItems().get(t.getTablePosition().getRow())
).setTitle(t.getNewValue());
}
}
);
}
以及FXML:

<AnchorPane prefHeight="600.0" prefWidth="800.0" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" fx:controller="gui.PlaylistsWindowController">
  <!-- TODO Add Nodes -->
                  -------unreleated code-------
                    <TableView id="table" fx:id="libaryTable" editable="true" prefHeight="272.0" prefWidth="494.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="24.0">
                      <columns>
                        <TableColumn prefWidth="75.0" text="Title" fx:id="titleColumn" />
                        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="91.0" text="Artist" fx:id="artistColumn" />
                        <TableColumn maxWidth="5000.0" minWidth="10.0" prefWidth="91.0" text="Serie" fx:id="serieColumn" />
                        <TableColumn prefWidth="75.0" text="Genre" fx:id="genreColumn" />
                        <TableColumn prefWidth="75.0" text="Point Gain" fx:id="pointGainColumn" />
                        <TableColumn prefWidth="75.0" text="Point Lost" fx:id="pointLossColumn" />
                      </columns>
                    </TableView>
                  -------unreleated code-------
</AnchorPane>

-------未公布代码-------
-------未公布代码-------
如果您的模型类(SongWrapper)(SongWrapper?SongRapper…?;)具有JavaFX样式的属性方法(即


那么onEditCommit应该是不必要的。TextFieldTableCell将其文本属性绑定到模型类中的相应属性。我认为,正因为如此,TextFieldTableCell不会触发onEditCommit,尽管我不确定最后一点。

它起作用了:D感谢这个问题让我抓狂>。
public class SongWraper {
  private final StringProperty title = new SimpleStringProperty(this, "title", "");
  public final String getTitle() {
    return title.get();
  }
  public final void setTitle(String title) {
    this.title.set(title);
  }
  public final StringProperty titleProperty() {
    return title ;
  }
}