【发布时间】:2015-02-04 21:55:14
【问题描述】:
我有这个适用于 TableView 的应用程序。它添加/删除新的行或列并为每个单元格存储数据。
public class MyTable extends Application {
private BorderPane root;
private HBox hBox;
private TableView<MyData> tableView;
private Button buttAddColumn, buttDeleteColumn;
private Button buttAddRow, buttDeleteRow;
private int numberOfColumns = 0;
private ObservableList<MyData> dataList = FXCollections.observableArrayList();
@Override
public void init() throws Exception {
root = new BorderPane();
hBox = new HBox();
buttAddColumn = new Button("Add columns");
buttDeleteColumn = new Button("Delete columns");
buttAddRow = new Button("Add rows");
buttDeleteRow = new Button("Delete rows");
tableView = new TableView<>();
tableView.setEditable(true);
tableView.setItems(dataList);
hBox.getChildren().addAll(buttAddColumn,buttDeleteColumn,buttAddRow,buttDeleteRow);
root.setTop(hBox);
root.setCenter(tableView);
//----------------------------------------------------------------
buttAddColumn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
buttAddColumnAction(event);
}
});
buttDeleteColumn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
buttDeleteColumnAction(event);
}
});
buttAddRow.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
buttAddRowAction(event);
}
});
buttDeleteRow.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
buttDeleteRowAction(event);
}
});
}
private void buttAddColumnAction(ActionEvent event){
int i = numberOfColumns;// thats the key for lambda expression. Unicate number for column to access its variable;
if(dataList.size() > 0)//resizing each data object with new variable
for(MyData x: dataList)
x.addNew(i);
TableColumn<MyData, Integer> newColumn = new TableColumn<>("#" + String.valueOf(++numberOfColumns));
newColumn.setCellValueFactory(cellData -> cellData.getValue().getCellValue(i).asObject());
newColumn.setCellFactory(TextFieldTableCell.<MyData, Integer>forTableColumn(new IntegerStringConverter()));
tableView.getColumns().add(newColumn);
}
private void buttDeleteColumnAction(ActionEvent event){
if(numberOfColumns > 0){
tableView.getColumns().remove(numberOfColumns-1);
--numberOfColumns;
if(dataList.size() > 0)
for(MyData x: dataList) //deleting unnecesary variable
x.deleteLast();
}
}
private void buttAddRowAction(ActionEvent event){
dataList.add(new MyData(numberOfColumns));
}
private void buttDeleteRowAction(ActionEvent event){
if(dataList.size() > 0){//resizing each data object with new variable
dataList.remove(dataList.size()-1);
}
}
//*******************************************************************
public class MyData{ //dont forget about public because you wont get acces to properties
private ObservableList<SimpleIntegerProperty> cellValue = FXCollections.observableArrayList();
public MyData(int howManyColumns) {
for(int i=0; i<howManyColumns; ++i)
this.cellValue.add(new SimpleIntegerProperty(new Random().nextInt(10)));
}
public SimpleIntegerProperty getCellValue(int whichOne) {
return cellValue.get(whichOne);
}
public void setCellValue(int cellValue, int whichOne) {
this.cellValue.set(whichOne, new SimpleIntegerProperty(cellValue));
}
public void addNew(int numberOfNewElement){ //ads another variable for another column
cellValue.add(new SimpleIntegerProperty(new Random().nextInt(10)));
}
public void deleteLast(){ //deletes last variable when column is deleted
cellValue.remove(cellValue.size()-1);
}
}
//*******************************************************************
@Override
public void start(Stage primaryStage) throws Exception {
try {
Scene scene = new Scene(root,400,400);
primaryStage.setScene(scene);
primaryStage.show();
} catch(Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
launch(args);
}
}
我怎样才能改变它,所以当用户双击单元格时,程序会等到他按下 0-9 的单个数字,然后自动接受它并打开下一个单元格来放置另一个数字(所以他不需要手动打开/关闭它们)?
我目前不知道如何做到这一点。甚至如何使空单元格等待数据(也许数据类应该由char 变量而不是Integer 组成,所以我可以将值"" 放入单元格???)
【问题讨论】: