JavaFX TableView как добавить элементы в столбец?

Я работаю над GUI, в котором пользователь может просматривать текстовые файлы из SYSTEM, а затем, когда пользователь нажимает кнопку "Start", программа читает текстовый файл/ы, создает списки из их данных и должна добавить их в TableView. Я застрял на вставке данных из списков в таблицу. Я создал названия колонок по именам файлов и добавил их в таблицу:

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);        
}

Имена столбцов берутся из списка tblConfigurationSystemColumns. Этот список может изменяться при каждом использовании GUI по количеству файлов, которые вы просматриваете из системы. (пока что будем считать, что у нас есть 2 строки: "column1", "column2")

Мне нужно добавить элементы в column1 из списка SysParameter, и в column2 из списка SysValues.

Как я могу добавить значения из каждого списка в каждый столбец по строкам? Если вам нужен еще какой-либо код, пожалуйста, скажите мне (просто дайте знать, что единственный код, который у меня есть, это создание списка из файлов).

EDIT:

Вот что я получил после построения колонки. После этого мне нужно получить "Параметр" и "Значение" для каждой колонки (как вы можете видеть). Я сделал список, который получает "Параметр" из текстового файла, и другой список, который получает "Значение" из текстового файла.

Как я могу поместить каждый список в свой столбец? Вот код, который создает эти списки:

            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
            } 
        });

Примечание 2: Пример текстового файла

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
  • Строка, содержащая "CE-", это просто название, чтобы знать, что она должна быть в "Конфигурации".
  • Каждая строка внутри - это "параметр" и значение (после запятой).

РЕДАКТ 3: Таблица должна выглядеть так (Этот пример взят из моего кода на Java SWT)

Спасибо большое ребята.

Решение

Данные для TableView хранятся в ObservableList свойства items. Вид TableView предназначен для хранения списка POJO, содержащих различные свойства. Каждое из свойств будет соответствовать TableColumn, который получает значение этих свойств с помощью Callback.

Поскольку вы просматриваете текстовые файлы, допустим, вы определите POJO следующим образом:

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);
    }

}

Из этого вы хотите получить TableView из TextFile, который имеет TableColumn для name и TableColumn для ize. Чтобы указать TableColumn, как получить нужное значение, вы устанавливаете cellValueFactory с соответствующим Callback. Этот Callback принимает TableColumn.CellDataFeatures и возвращает ObservableValue. Если ObservableValue изменится, TableColumn обновит элемент соответствующей TableCell.

ObservableList files = ...;
TableView table = new TableView();
table.setItems(files);

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

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

Обратите внимание, что каждый TextFile в files является строкой в TableView.

Комментарии (2)

Полагаю, вы ищете что-то подобное:

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

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

Посмотрите здесь подробное описание: https://docs.oracle.com/javafx/2/ui_controls/table-view.htm

Комментарии (1)

Выберите тип товара соответствующим образом. В вашем описании указаны следующие свойства:

  • Данные таблицы не редактируются после загрузки.
  • Вы не можете жестко закодировать количество файлов.

Поэтому подходящим вариантом структуры данных будет List. Каждый список содержит по одному элементу для каждого столбца.


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

    for (String s : fileItems) {
        List 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 
Комментарии (0)