Я работаю над 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
.
Как я могу добавить значения из каждого списка в каждый столбец по строкам? Если вам нужен еще какой-либо код, пожалуйста, скажите мне (просто дайте знать, что единственный код, который у меня есть, это создание списка из файлов).
Вот что я получил после построения колонки. После этого мне нужно получить "Параметр" и "Значение" для каждой колонки (как вы можете видеть). Я сделал список, который получает "Параметр" из текстового файла, и другой список, который получает "Значение" из текстового файла.
Как я могу поместить каждый список в свой столбец? Вот код, который создает эти списки:
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
РЕДАКТ 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<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
в files
является строкой в TableView
.
Полагаю, вы ищете что-то подобное:
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
Выберите тип товара соответствующим образом. В вашем описании указаны следующие свойства:
Поэтому подходящим вариантом структуры данных будет 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);
}
}