我正在尝试创建一个TableView,而不知道它应该有多少列。 我已经实现了与文档示例http://www.java2s.com/Code/Java/JavaFX/AddnewrowtoTableView.htm
中的类相同的类但我想要的是该类有一个ArrayList参数,比如private final ArrayList<Double> values;
,并且能够为ArrayList中的每个值创建一个列。
我知道这不正确,所以我想知道是否有一种非复杂的方式来实现这一点。
答案 0 :(得分:-2)
如果要使用此类,可以添加等于JTable
的行的列和数据,可以使用String
数组来放置列的标题,以及添加数据的矩阵,如果只想添加一行,则使用addRow
方法。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.MapValueFactory;
/**
*
* @author Raul Junior
*/
public class TableView2 extends TableView {
private final ObservableList<Map> allData;
private final ArrayList<ModeloColumna> columnList;
private TableColumn<Map,String> columns[];
private String defaultName = "column";
private double minWidthColumn;
/**
* Constructor por defecto. Inicializa el objeto allData, columnList,
* invoca el método setEditable(true).
*/
public TableView2(){
allData = FXCollections.observableArrayList();
columnList = new ArrayList<>();
setEditable(true);
setMinWidthColumn(130);
}
/**
* Constructor que crea columnas con títulos.
* Inicializa el objeto allData, columnList, invoca el método setEditable(true).
* @param columnTitles Títulos de las columnas que se crearán.
*/
public TableView2(String columnTitles[]){
allData = FXCollections.observableArrayList();
columnList = new ArrayList<>();
setEditable(true);
setMinWidthColumn(130);
setColumnTitles(columnTitles);
}
/**
* Constructor que crea columnas con títulos y filas con sus correspondientes datos.
* Inicializa el objeto allData, columnList, invoca el método setEditable(true).
* @param columnTitles Títulos de las columnas que se crearán.
* @param data Datos que tendrán las celdas.
*/
public TableView2(String columnTitles[], String data[][]){
allData = FXCollections.observableArrayList();
columnList = new ArrayList<>();
setEditable(true);
setMinWidthColumn(130);
setColumnTitles(columnTitles);
addRows(data);
}
/**
* Añade una fila.
* @param values El array que contiene los valores de la nueva fila.
*/
public void addRow(String values[]){
Map<String, String> row = new HashMap<>();
for(int i = 0; i < values.length; i++){
row.put(columnList.get(i).getColumnKeyMap(), values[i]);
}
allData.add(row);
this.getItems().add(allData.get(allData.size()-1));
}
/**
* Añade nuevas filas.
* @param values Es la matriz que contiene los valores de las nuevas filas
* que se crearán.
*/
public final void addRows(String values[][]){
for(String[] value : values){
Map<String, String> row = new HashMap<>();
for(int i = 0; i < value.length; i++){
row.put(columnList.get(i).getColumnKeyMap(), value[i]);
}
allData.addAll(row);
this.getItems().add(allData.get(allData.size()-1));
}
}
/**
* Obtiene un array de TableColumn.
* @return Devuelve un array de TableColumns
*/
public TableColumn<Map, String>[] getArrayColumns() {
return columns;
}
/**
* Obtiene la llave del mapeo de la columna.
* @param column El índice de la columna.
* @return Devuelve un String.
*/
public String getColumnKeyMap(int column) {
return columnList.get(column).getColumnKeyMap();
}
/**
* Obtiene el título de la columna.
* @param column El índice de la columna.
* @return Devuleve un String.
*/
public String getColumnTitle(int column) {
return columnList.get(column).getColumnTitle();
}
/**
* Obtiene el atributo defaultName.
* @return Devuelve un String
*/
public String getDefaultName() {
return defaultName;
}
/**
* Obtiene el valor del mínimo ancho de la columna.
* @return Devuelve un double.
*/
public double getMinWidthColumn() {
return minWidthColumn;
}
/**
* Obtiene el valor de la celda según los índices de fila y columna.
* @param row El índice de la fila.
* @param column El índice de la columna.
* @return Devuelve un String.
*/
public String getValueAt(int row, int column){
return (String)allData.get(row).get(columnList.get(column).getColumnKeyMap());
}
/**
* Crea y pone títulos a las columnas.
* @param columnTitles Es el array que contiene los títulos de las columnas.
*/
public final void setColumnTitles(String columnTitles[]) {
columns = new TableColumn[columnTitles.length];
for(int i = 0; i < columnTitles.length; i++){
columnList.add(new ModeloColumna(columnTitles[i], defaultName+i));
columns[i] = new TableColumn(columnList.get(i).getColumnTitle());
columns[i].setCellValueFactory(new MapValueFactory(columnList.get(i).getColumnKeyMap()));
columns[i].setMinWidth(minWidthColumn);
//tableView.getColumns().add(columns[i]);
}
this.getColumns().setAll((Object[]) columns);
}
/**
*
* Elimina la fila según el índice.
* @param row El índice de la fila.
*/
public void remove(int row) {
allData.remove(row);
this.getItems().remove(row);
}
/**
* Cambia la propiedad defaultName.
* @param defaultName Nombre por defecto con el que se mapeará cada columna,
* por defecto es "column", cada columna se mapea con el nombre mas el índice,
* es decir: column0, column1 y así sucesivamente.
*/
public void setDefaultName(String defaultName) {
this.defaultName = defaultName;
}
/**
* Cambia el valor de la propiedad minWidthColumn.
* @param minWidthColumn El mínimo tamaño de la columna.
*/
public final void setMinWidthColumn(double minWidthColumn) {
this.minWidthColumn = minWidthColumn;
}
/**
* @author Raul Junior
*/
private class ModeloColumna{
private final String columnKeyMap;
private final String columnTitle;
public ModeloColumna(String columnTitle, String columnKeyMap){
this.columnTitle = columnTitle;
this.columnKeyMap = columnKeyMap;
}
public String getColumnKeyMap() {
return columnKeyMap;
}
public String getColumnTitle() {
return columnTitle;
}
}
}