在javaFX中填充一个简单的TableColumn

在javaFX中填充一个简单的TableColumn,java,javafx,Java,Javafx,我正在试验在JavaFXTableColumn中显示字符串的ArrayList。我已经阅读了许多关于显示和动态修改自定义类等的详细示例,但我只想看到显示arraylist数据的列的基本实现。 我尝试过各种方法,包括使用观察者,但我的兴趣远不止这些 非常感谢您的建议 这是我的密码: 主要内容: 控制器: package testCram; import javafx.beans.property.ReadOnlyStringWrapper; import javafx.fxml.FXML; im

我正在试验在JavaFXTableColumn中显示字符串的ArrayList。我已经阅读了许多关于显示和动态修改自定义类等的详细示例,但我只想看到显示arraylist数据的列的基本实现。 我尝试过各种方法,包括使用观察者,但我的兴趣远不止这些

非常感谢您的建议

这是我的密码: 主要内容:

控制器:

package testCram;

import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import java.util.*;

public class Controller {
//instances of all controls

@FXML
public TableView<String> table;
@FXML
public TableColumn<String , String> column1;

public void setData(){

    Collection<String> list = new ArrayList<>();
    list.add("String1");
    list.add("String2");
    list.add("String3");
    list.add("String4");
    list.add("String5");
    list.add("String6");

    //I understand that you need to use 'setCellValueFactory' but I don't see what is needed to extract the values from list.
    column1.setCellValueFactory(cellData ->
            new ReadOnlyStringWrapper(cellData.getValue()));
    }
}
packagetestcram;
导入javafx.beans.property.ReadOnlyStringWrapper;
导入javafx.fxml.fxml;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入java.util.*;
公共类控制器{
//所有控件的实例
@FXML
公共表视图表;
@FXML
公共表格第1栏;
public void setData(){
集合列表=新的ArrayList();
列表。添加(“String1”);
列表。添加(“String2”);
列表。添加(“第3条”);
列表。添加(“第4条”);
列表。添加(“第5条”);
列表。添加(“第6条”);
//我知道您需要使用“setCellValueFactory”,但我不知道从列表中提取值需要什么。
列1.setCellValueFactory(cellData->
新的ReadOnlyStringWrapper(cellData.getValue());
}
}
FXML:


我进一步研究了这个问题,我将发布我自己的答案:

为了使列分解数据,必须指示表填充数据: 添加行: table.getItems().addAll(列表)

列1.setCellValueFactory(cellData-> 新的ReadOnlyStringWrapper(cellData.getValue())


我希望这能帮助其他陷入困境的人。

A
TableColumn
必须有一个非空属性。如果您对
TableColumn
的责任有错误的假设,那么这是违反直觉的。它告诉
TableView
如何将行项目转换为
observeValue
,该值包含通过其
cellValueFactory
显示的数据。不同意,没有什么不直观的:表包含数据对象列表,每列显示该数据对象的一个属性。因此有两件事要做:a)告诉表要包含哪些数据列表(通过setItems/addItem)和b)告诉列要显示哪些属性(通过cellValueFactory)。学习关于fx的任意基础教程可能会有所帮助——只是说;)
package testCram;

import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import java.util.*;

public class Controller {
//instances of all controls

@FXML
public TableView<String> table;
@FXML
public TableColumn<String , String> column1;

public void setData(){

    Collection<String> list = new ArrayList<>();
    list.add("String1");
    list.add("String2");
    list.add("String3");
    list.add("String4");
    list.add("String5");
    list.add("String6");

    //I understand that you need to use 'setCellValueFactory' but I don't see what is needed to extract the values from list.
    column1.setCellValueFactory(cellData ->
            new ReadOnlyStringWrapper(cellData.getValue()));
    }
}
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.Pane?>
<?import javafx.scene.layout.RowConstraints?>

<GridPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-                           Infinity" minWidth="-Infinity" prefHeight="718.0" prefWidth="569.0" xmlns="http://javafx.com/javafx/8.0.111" xmlns:fx="http://javafx.com/fxml/1" fx:controller="testCram.Controller">
 <columnConstraints>
     <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0"     prefWidth="100.0" />

 </columnConstraints>
 <rowConstraints>
 <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />

</rowConstraints>
<children>
<Pane prefHeight="718.0" prefWidth="596.0">
<children>
<TableView fx:id="table" layoutX="75.0" layoutY="99.0" prefHeight="200.0" prefWidth="399.0">
<columns>
<TableColumn fx:id="column1" prefWidth="100.0" text="String" />
</columns>
</TableView>
</children></Pane>
</children>
</GridPane>