ControlsFx-Spreadsheetview-DateCell-继续编辑失败的内容

时间:2019-02-27 14:34:56

标签: spreadsheet controlsfx

我们使用具有不同类型的单元格类型的电子表格视图。

SpreadsheetCellEditor 的文档中,我们找到了以下文本:

  

有关验证给定值的策略在   SpreadsheetCellType.match(Object)。如果值不符合要求   保存单元格时,没有任何反应,编辑器继续进行编辑。


现在我们面临以下问题:

如果您在整数单元格中输入“ abcd”作为错误的输入并按Enter键,则不会发生任何事情。编辑器仍处于编辑模式。这正是文档中描述的行为。那就是我们想要的。

如果您有一个日期单元格,输入了错误的日期或其他内容,然后按Enter键,单元格将停止编辑模式,并将值返回“旧”值。

我们如何防止这种行为? 也许是Date SpreadsheetCellType中的错误?

我们使用了许多自定义的cellType类,但是通过这个小例子,行为也是可以理解的。

我希望一切都解释清楚。

感谢您的帮助。

import java.time.LocalDate;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.controlsfx.control.spreadsheet.GridBase;
import org.controlsfx.control.spreadsheet.SpreadsheetCell;
import org.controlsfx.control.spreadsheet.SpreadsheetCellType;
import org.controlsfx.control.spreadsheet.SpreadsheetView;

public class SpreadSheetExample extends Application {

private SpreadsheetView getSpreadSheet() {
    SpreadsheetView spreadSheetView;
    GridBase grid;
    grid = new GridBase(10, 2);
    spreadSheetView = new SpreadsheetView(grid);

    ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
    for (int row = 0; row < grid.getRowCount(); ++row) {
        final ObservableList<SpreadsheetCell> list = FXCollections.observableArrayList();
        for (int column = 0; column < grid.getColumnCount(); ++column) {
            if (column < 1) {
                list.add(SpreadsheetCellType.DATE.createCell(row, column, 1, 1, LocalDate.now()));
            } else {
                list.add(SpreadsheetCellType.INTEGER.createCell(row, column, 1, 1, column));
            }

        }
        rows.add(list);
    }

    spreadSheetView.getColumns().forEach((column) -> {
        column.setPrefWidth(280);
    });

    grid.setRows(rows);

    return spreadSheetView;
}

@Override
public void start(Stage primaryStage) {

    StackPane root = new StackPane();
    root.getChildren().add(getSpreadSheet());

    Scene scene = new Scene(root, 800, 400);

    primaryStage.setTitle("Hello World!");
    primaryStage.setScene(scene);
    primaryStage.show();
}

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

}

更新: 没有controlfx专家?

已解决: https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A

1 个答案:

答案 0 :(得分:0)

已解决。 我从ControlsFX的主要贡献者之一那里得到了一些帮助。

文档有点不清楚。 为了获得所描述的行为,可以创建基于现有单元格类型和编辑器的自定义单元格类型和编辑器。

有关所有详细信息,请查看此线程: https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A