ControlsFx - Spreadsheetview - DateCell - 继续编辑失败
ControlsFx - Spreadsheetview - DateCell - keep editing on failure
我们使用包含不同类型单元格的电子表格视图。
在 SpreadsheetCellEditor 的文档中,我们发现了以下文本:
The policy regarding validation of a given value is defined in
SpreadsheetCellType.match(Object). If the value doesn't meet the requirements
when saving the cell, nothing happens and the editor keeps editing.
现在我们面临以下问题:
如果您在整数单元格中输入 "abcd" 作为错误输入并按下回车键,则不会发生任何事情。编辑器仍处于编辑模式。这正是文档中描述的行为。这就是我们想要的。
如果您有一个日期单元格并输入了错误的日期或其他内容并按下回车键,单元格将停止编辑模式并将值 return 设置为 "old" 值。
我们如何防止这种行为?
也许它是 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);
}
}
更新:
没有controlsfx专家吗?
已解决:
https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A
已解决。
我从 ControlsFX 的主要贡献者之一那里得到了一些帮助。
文档有点不清楚。
为了获得所描述的行为,可以创建一个基于现有单元格类型 + 编辑器的自定义单元格类型。
有关所有详细信息,请查看此线程:
https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A
我们使用包含不同类型单元格的电子表格视图。
在 SpreadsheetCellEditor 的文档中,我们发现了以下文本:
The policy regarding validation of a given value is defined in SpreadsheetCellType.match(Object). If the value doesn't meet the requirements when saving the cell, nothing happens and the editor keeps editing.
现在我们面临以下问题:
如果您在整数单元格中输入 "abcd" 作为错误输入并按下回车键,则不会发生任何事情。编辑器仍处于编辑模式。这正是文档中描述的行为。这就是我们想要的。
如果您有一个日期单元格并输入了错误的日期或其他内容并按下回车键,单元格将停止编辑模式并将值 return 设置为 "old" 值。
我们如何防止这种行为? 也许它是 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);
}
}
更新: 没有controlsfx专家吗?
已解决: https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A
已解决。 我从 ControlsFX 的主要贡献者之一那里得到了一些帮助。
文档有点不清楚。 为了获得所描述的行为,可以创建一个基于现有单元格类型 + 编辑器的自定义单元格类型。
有关所有详细信息,请查看此线程: https://groups.google.com/forum/#!topic/controlsfx-dev/ro7-MvLFD1A