Javafx TableView ArrayList类属性

时间:2016-03-13 15:48:01

标签: java javafx

我正在尝试创建一个TableView,而不知道它应该有多少列。 我已经实现了与文档示例http://www.java2s.com/Code/Java/JavaFX/AddnewrowtoTableView.htm

中的类相同的类

但我想要的是该类有一个ArrayList参数,比如private final ArrayList<Double> values;,并且能够为ArrayList中的每个值创建一个列。

我知道这不正确,所以我想知道是否有一种非复杂的方式来实现这一点。

1 个答案:

答案 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;
        }
    }
}