如何使用模式弹出窗口更新网格中的数据与自定义单元格

时间:2015-11-09 20:02:40

标签: tableview javafx-8

我希望能够使用模态窗口向用户显示列的内容以进行编辑。我无法做到这一点,我不确定我哪里出错了。

我在表格中提供了一个按钮,用于指示是否有其他详细信息(在本例中为注释)。当用户选择按钮时,我想打开一个模态对话框来输入数据,当它关闭时,更新该字段。

enter image description here

我已经把这大部分都搞定了,但数据还没有回到我的模型。我尝试了几件事,但都没有结果。我正在进行的提交编辑调用似乎没有在"编辑模式"中看到该字段。然后跳过。

这是我自定义表格单元格的代码:

public class CommentTableCell<T> extends TableCell<T, String> {
private Button actionBtn;
private TextArea textArea;
public CommentTableCell(TableColumn<T, String> column) {
    super();

    actionBtn = new Button("my action");
    actionBtn.setTooltip(new Tooltip("Select to add/edit comments..."));
    actionBtn.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            startEdit();
            System.out.println("Action: "+getItem());
            Stage commentStage = new Stage();
            AnchorPane ap = new AnchorPane();
            textArea = new TextArea();
            AnchorPane.setTopAnchor(textArea, 5.0);
            AnchorPane.setBottomAnchor(textArea, 5.0);
            AnchorPane.setLeftAnchor(textArea, 5.0);
            AnchorPane.setRightAnchor(textArea, 5.0);
            ap.getChildren().add(textArea);
            Scene commentScene = new Scene (ap, 200, 200);
            commentStage.setScene(commentScene);
            commentStage.show();
            commentStage.setOnCloseRequest(a -> {
                commitEdit(textArea.getText());
            });

// I have tried with an column.setOnEditCommit() as well as what is noted below which I found here, passing in the column.
                final TableView<T> tableView = getTableView();
                tableView.getSelectionModel().select(getTableRow().getIndex());
                tableView.edit(tableView.getSelectionModel().getSelectedIndex(), column);
            }
        });
        setText(null);
    }

@Override
public void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    actionBtn.getStyleClass().clear();
    setEditable(false);
    if (item != null && item.length() > 0) {
        actionBtn.getStyleClass().add(CSSConstants.GRID_BUTTON_EDIT_COMMNET);
        setGraphic(actionBtn);
    } else if (!empty)  {
        actionBtn.getStyleClass().add(CSSConstants.GRID_BUTTON_ADD_COMMNET);
        setGraphic(actionBtn);
    } else {
        setGraphic(null);
    }
}

}

在执行期间,它命中了commitEdit()调用,并且以下在TableCell中的isEditing为null:

@Override public void commitEdit(T newValue) {
    if (! isEditing()) return;

我的表看起来基本上是这样的:

TableView<SomeDTO> addressTableView = new TableView()
addressTableView.setItems(sortedItems);
addressTableView.setEditable(true);


commentsColumn.setCellValueFactory(cellValue -> cellValue.getValue().commentsProperty());
        commentsColumn.setCellFactory(tc -> new CommentTableCell<SomeDTO>(commentsColumn));

1 个答案:

答案 0 :(得分:0)

我找到了解决问题的方法 - 虽然我不确定这是不是最好的方法。

我已经将CommentTableCell更改为如下,它看起来像魅力......

public class CommentTableCell<T> extends TableCell<T, String> {
private Button actionBtn;
public CommentTableCell() {
    super();

    actionBtn = new Button("my action");
    actionBtn.setTooltip(new Tooltip("Select to add/edit comments..."));
    actionBtn.setOnAction(event ->
        {

            Stage commentStage = new Stage();
            AnchorPane ap = new AnchorPane();
            TextArea textArea = new TextArea();
            AnchorPane.setTopAnchor(textArea, 5.0);
            AnchorPane.setBottomAnchor(textArea, 5.0);
            AnchorPane.setLeftAnchor(textArea, 5.0);
            AnchorPane.setRightAnchor(textArea, 5.0);
            ap.getChildren().add(textArea);
            Scene commentScene = new Scene (ap, 200, 200);
            commentStage.setScene(commentScene);

            if(getItem() != null) {
                String myValue = getItem();
                textArea.setText(myValue);
                textArea.selectAll();
            }

            commentStage.show();
            commentStage.setOnCloseRequest(a -> {
                commitEdit(textArea.getText());
            });

    });
}

@Override
@SuppressWarnings({"unchecked", "rawtypes"})
public void commitEdit(String item) {

    if (isEditing()) {
        super.commitEdit(item);
    } else {
        final TableView table = getTableView();
        if (table != null) {
            TablePosition position = new TablePosition(getTableView(),
                    getTableRow().getIndex(), getTableColumn());
            CellEditEvent editEvent = new CellEditEvent(table, position,
                    TableColumn.editCommitEvent(), item);
            Event.fireEvent(getTableColumn(), editEvent);
        }
        updateItem(item, false);
        if (table != null) {
            table.edit(-1, null);
        }

    }
}

@Override
public void updateItem(String item, boolean empty) {
    super.updateItem(item, empty);
    actionBtn.getStyleClass().clear();
    setEditable(false);
    if (item != null && item.length() > 0) {
        actionBtn.getStyleClass().add(CSSConstants.GRID_BUTTON_EDIT_COMMNET);
        setGraphic(actionBtn);
    } else if (!empty)  {
        actionBtn.getStyleClass().add(CSSConstants.GRID_BUTTON_ADD_COMMNET);
        setGraphic(actionBtn);
    } else {
        setGraphic(null);
    }
}

}