JavaFX TableView如何向列添加项目?

时间:2018-09-13 11:46:46

标签: java arrays user-interface javafx

我正在使用一个GUI,用户可以从SYSTEM浏览文本文件,然后当用户按下“开始”按钮时,程序将读取文本文件,从其数据创建列表,并应将其添加到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"

我需要从列表column1SysParameter以及从列表column2SysValues添加项目。

如何将每个列表中的值按行添加到每一列? 如果您需要更多代码,请告诉我(请告诉我,列表中是我从文件创建的唯一代码)。

编辑: enter image description here

这是我在建立专栏文章后得到的。 之后,我需要为每一列获取“参数”和“值”(如您所见)。 我已经创建了一个从文本文件中获取“参数”的列表,以及另一个从文本文件中获取“值”的列表。

如何将每个列表放在其列中? 这是构建此列表的代码:

            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中的代码) enter image description here

非常感谢你们。

3 个答案:

答案 0 :(得分:2)

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的{​​{1}}和name的{​​{1}}。要告诉TableColumn如何获得正确的值,请使用适当的size设置TableColumn。该cellValueFactory接受Callback并返回Callback。如果TableColumn.CellDataFeatures发生变化,则ObservableValue将更新相应ObservableValue的项目。

TableColumn

请注意,TableCell中的每个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); TextFile中的一行。

答案 1 :(得分:0)

我想您正在寻找类似的东西:

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

答案 2 :(得分:0)

相应地选择项目类型。您的描述指示以下属性:

  • 表数据一旦加载就不会被编辑。
  • 您不能对文件数量进行硬编码。

因此,数据结构的适当选择将是List<String>。每个列表的每一列都包含一个元素。

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