我正在使用一个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"
)
我需要从列表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中的代码)
非常感谢你们。
答案 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);
}
}