Estoy trabajando en una GUI para que el usuario pueda explorar archivos de texto desde el SISTEMA y luego, cuando el usuario presiona el botón "Inicio", el programa lee los archivos de texto, crea listas a partir de sus datos y se supone que debe agregarlos a {{X0 }}. Estoy atascado en insertar los datos de las listas a la tabla. Creé los nombres de las columnas por nombre de archivo y lo agregué a la tabla:

tblConfigurationSystemColumns.add("Parameter Name");
tblSystemColumn.stream().map((str) -> str.split("PCM")).forEachOrdered((a) -> {
tblConfigurationSystemColumns.add(a[0].trim());
        });
for (int i = 0; i < tblConfigurationSystemColumns.size(); i++) {
    TableColumn col = new TableColumn(tblConfigurationSystemColumns.get(i));
    tableConfigurationSystem.getColumns().addAll(col);        
}

Los nombres de columna que provienen de la lista tblConfigurationSystemColumns. Esta lista puede modificarse con cada uso de la GUI por el número de archivos que explora desde el sistema. (por ahora, pensemos que tenemos 2 cadenas dentro: "column1","column2")

Necesito agregar elementos a column1 de la lista SysParameter y a column2 de la lista SysValues.

¿Cómo puedo agregar valores de cada lista a cada columna por filas? Si necesita más código, por favor dígame (solo déjele saber, el único código que tengo es la lista que se crea a partir de los archivos).

EDIT: ingrese la descripción de la imagen aquí

Esto es lo que obtuve después de la construcción de la columna. después de esto, necesito obtener el "Parámetro" y el "Valor" para cada columna (como puede ver). He hecho una lista que obtiene el "Parámetro" del archivo de texto, y otra lista que obtiene el "Valor" del archivo de texto.

¿Cómo puedo poner cada lista en su columna? Este es el código que construye estas listas:

            boolean inCESystem = false;
        for (final String line : list) {
    if (line.contains("CE-") && !(line.contains("CE-system-equipment-pm") || line.contains("inbound") || line.contains("outbound"))) {
        inCESystem = true;
    }
    else if (line.trim().isEmpty()) {
        inCESystem = false;
    }
    else if (inCESystem) {
        CE_System.add(line);
    }
        }
        boolean inCESystemInbound = false;
        for (final String line : list) {
    if (line.contains("CE-") && (line.contains("inbound")) ) {
        inCESystemInbound = true;
    }
    else if (line.trim().isEmpty()) {
        inCESystemInbound = false;
    }
    else if (inCESystemInbound) {
        CE_System.add("inbound_loadlock - "+line.trim());
    }
        }
        boolean inCESystemOutbound = false;
        for (final String line : list) {
    if (line.contains("CE-") && (line.contains("outbound")) ) {
        inCESystemOutbound = true;
    }
    else if (line.trim().isEmpty()) {
        inCESystemOutbound = false;
    }
    else if (inCESystemOutbound) {
        CE_System.add("outbound_loadlock - "+line.trim());
    }
        }            
        /*
         * Check the CE list to split each object per parameter and value to different lists
         */
        CE_System.stream().map((str) -> str.split(",")).map((a) -> {
            CE_SystemParameter.add(a[0].trim()); //Parameters
            return a;
        }).forEachOrdered((a) -> {
            if(a.length > 1) {
                CE_System_Value.add(a[1].trim()); //Values
            } else {
                CE_System_Value.add(""); //add blank if parameter doesn't have value
            } 
        });

EDIT 2: Ejemplo de archivo de texto

CE-system:
   No features to set for this item...

CE-system-componentmanager:
   Bootstrap Parallelism                             ,Parallel Bootstrapping

CE-system-components:
   No features to set for this item...

CE-system-components-accessmanager:
   Access control enable                             ,disabled
   Access policy prototyping                         ,enabled
   Access user group                                 ,enabled
   Implicit roles access policy                      ,disabled
   World access policy                               ,disabled

CE-system-components-eqlog:
   EquipmentLog Enable                               ,false
  • La línea que contiene "CE-" es solo el título para saber que debe estar en la pestaña "Configuración".
  • cada línea dentro es el "parámetro" y el valor (después de la coma).

EDIT 3: La tabla debería verse como este ejemplo (Este ejemplo es de mi código en Java SWT) ingrese la descripción de la imagen aquí

Muchas gracias muchachos.

-1
Ang3lStyl3X 13 sep. 2018 a las 14:46

3 respuestas

La mejor respuesta

Los datos para un TableView se guardan en el ObservableList de la propiedad items. Un TableView está diseñado para contener una lista de POJO que contienen varias propiedades. Cada una de las propiedades corresponderá a un TableColumn que obtiene el valor de estas propiedades usando un Callback.

Como está explorando archivos de texto, supongamos que define un POJO de esta manera:

import javafx.beans.property.LongProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.StringProperty;
import javafx.beans.property.SimpleStringProperty;

public class TextFile {

    private final StringProperty name = new SimpleStringProperty(this, "name");
    public final void setName(String name) { this.name.set(name); }
    public final String getName() { return name.get(); }
    public final StringProperty nameProperty() { return name; }

    private final LongProperty size = new SimpleLongProperty(this, "size");
    public final void setSize(long size) { this.size.set(size); }
    public final long getSize() { return size.get(); }
    public final LongProperty sizeProperty() { return size; }

    public TextFile() {}

    public TextFile(String name, long size) {
        setName(name);
        setSize(size);
    }

}

De esto querrás un TableView de TextFile s que tiene un TableColumn para name y un TableColumn para size. Para indicarle a un TableColumn cómo obtener el valor correcto, configure el cellValueFactory con el Callback apropiado. Este Callback acepta un TableColumn.CellDataFeatures y devuelve un ObservableValue. Si ObservableValue cambia, TableColumn actualizará el elemento del TableCell correspondiente.

ObservableList<TextFile> files = ...;
TableView<TextFile> table = new TableView<>();
table.setItems(files);

TableColumn<TextFile, String> nameCol = new TableColumn<>("Name");
nameCol.setCellValueFactory(features -> features.getValue().nameProperty());
table.getColumns().add(nameCol);

TableColumn<TextFile, Number> sizeCol = new TableColumn<>("Size");
sizeCol.setCellValueFactory(features -> features.getValue().sizeProperty());
table.getColumns().add(sizeCol);

Tenga en cuenta que cada TextFile en files es una fila en el TableView.

2
Slaw 13 sep. 2018 a las 12:47

Elija el tipo de elemento en consecuencia. Su descripción indica las siguientes propiedades:

  • Los datos de la tabla no se editan una vez que se cargan.
  • No puede codificar el número de archivos.

Por lo tanto, una elección adecuada de la estructura de datos sería List<String>. Cada lista contiene un elemento para cada columna.

public void initializeTableColumns(TableView<List<String>> table, File file, File... files) {
    List<String> fileItems = readFile(file);
    TableColumn<List<String>, String> column = new TableColumn<>(file.getName());
    column.setCellValueFactory(cd -> new SimpleStringProperty(cd.getValue().get(0));
    table.getColumns().add(column);

    for (String s : fileItems) {
        List<String> row = new ArrayList<>(files.length + 1);
        row.add(s);
        table.getItems().add(row);
    }

    for (int fileIndex = 0; fileIndex < files.length; fileIndex++) {
        File f = files[fileIndex];

        fileItems = readFile(f);
        int itemCount = Math.min(fileItems.size(), table.getItems().size());
        // add items from file
        for (int i = 0; i < itemCount; i++) {
            table.getItems().get(i).add(fileItems.get(i));
        }
        if (itemCount <= table.getItems.size()) {
            // fill items that may be missing
            for (int i = itemCount; i < table.getItems().size(); i++) {
                table.getItems().get(i).add(null);
            }
        } else {
            // add missing rows
            for (int i = table.getItems.size(); i < itemCount; i++) {
                List<String> row = new ArrayList<>(files.length + 1);
                for (int j = 0; j <= fileIndex; j++) {
                    row.add(null);
                }
                row.add(fileItems.get(i));
                table.getItems().add(row);
            }
        }

        final index = fileIndex + 1;
        column = new TableColumn<>(f.getName());
        column.setTableColumn(cd -> new SimpleStringProperty(cd.getValue().get(index)));
        table.getColumns().add(column);
    }
}
0
fabian 13 sep. 2018 a las 13:08

Supongo que estás buscando algo así:

TableColumn< YourObject, String> col = new TableColumn<>();
col.setCellValueFactory(new PropertyValueFactory("nameOfThePropertyYouWantToDisplay");
TableColumn< YourObject, String> col2 ....

TableView < YourObject> table = new TableView();
table.setItems(observableListOfYourObject);

Busque aquí una descripción detallada: https://docs.oracle.com /javafx/2/ui_controls/table-view.htm

0
fabian 13 sep. 2018 a las 12:45