具有多行、背景色和居中文本的JavaFX表格

具有多行、背景色和居中文本的JavaFX表格,java,javafx,tableview,multiline,Java,Javafx,Tableview,Multiline,在JavaFX表视图中,如何 是否创建多行列 中心内容 并为每一行(整行)设置背景色 我使用自定义的CellFactory创建了一个多行列。我还知道setAlignment(Pos.CENTER)和setxtalignment(textlights.CENTER)将文本居中。但是,我的示例应用程序中的文本每行没有正确居中。此外,我没有在文本对象上设置背景色。现在我的方法是为每一行添加一个窗格,效果很好。但是如何使窗格填充整个列的宽度和高度的1/3 作为一个起点,这就是我所期望的代码(尽管我知

在JavaFX表视图中,如何

  • 是否创建多行列
  • 中心内容
  • 并为每一行(整行)设置背景色
我使用自定义的
CellFactory
创建了一个多行列。我还知道
setAlignment(Pos.CENTER)
setxtalignment(textlights.CENTER)
将文本居中。但是,我的示例应用程序中的文本每行没有正确居中。此外,我没有在
文本
对象上设置背景色。现在我的方法是为每一行添加一个
窗格
,效果很好。但是如何使
窗格
填充整个列的宽度和高度的1/3

作为一个起点,这就是我所期望的代码(尽管我知道它没有做我想做的事情):

multicl.setCellFactory(新回调(){
@重写公共TableCell调用(TableColumn Multicl){
返回新的TableCell(){
私有组grp=null;
@覆盖公共void updateItem(最终用户,布尔值为空){
super.updateItem(person,空);
此参数设置对齐(位置中心);
如果(!isEmpty()){
Text Text=新文本(person.getFirstName());
text.setX(0);
text.setY(0);
text.setTextAlignment(TextAlignment.CENTER);//居中文本?
窗格=新窗格();
窗格.设置样式(“-fx背景色:#66BB66;”);
窗格。setLayoutX(0);
窗格。设置布局(0);
窗格。设置高度(20);
pane.setPrefWidth(this.prefWidth(-1));//列宽?
// -----
Text text2=新文本(person.getLastName());
text2.setX(0);
text2.setY(20);
text2.setTextAlignment(TextAlignment.CENTER);//居中文本?
窗格pane2=新窗格();
pane2.setStyle(“-fx背景色:#79A8D8;”);
pane2.setLayoutX(0);
第2栏:设置布局(20);
窗格2.设置高度(20);
pane2.setPrefWidth(this.prefWidth(-1));//列宽?
// -----
Text text3=新文本(person.getEmail());
text3.setX(0);
文本3.塞蒂(40);
text3.setTextAlignment(TextAlignment.CENTER);//居中文本?
窗格pane3=新窗格();
窗格3.设置样式(“-fx背景色:#FF8888;”);
窗格3.设置布局X(0);
窗格3.设置布局(40);
窗格3.设置高度(20);
pane3.setPrefWidth(this.prefWidth(-1));//列宽?
// -----
grp组=新组();
grp.getChildren().add(窗格);
grp.getChildren().add(文本);
grp.getChildren().add(pane2);
grp.getChildren().add(text2);
grp.getChildren().add(第3窗格);
grp.getChildren().add(text3);
设置图形(grp);
setStyle(“-fx填充:0;”);
}
}
};
}
});
我期待这样的输出:


有关完整的、可编译的代码示例,请查看。

使用合适的布局窗格(例如a
VBox
),并将
标签添加到其中。您可以使用
VBox.setHgrow(…)
配置标签以填充
VBox
的宽度。您还需要设置标签的最大宽度以允许其增长

另一方面,每次调用
updateItem(…)
方法时重新创建控件不是一个好的做法。创建它们一次,然后在
updateItem(…)
方法中使用所需数据配置它们

例如:

    TableColumn<Person, Person> multiCol = new TableColumn<>("Multiline");
    multiCol.setCellValueFactory(cellData -> 
        new ReadOnlyObjectWrapper<Person>(cellData.getValue()));
    multiCol.setCellFactory(column -> new TableCell<Person, Person>() {

        private VBox graphic ;
        private Label firstNameLabel ;
        private Label lastNameLabel ;
        private Label emailLabel ;

        // Anonymous constructor:
        {
            graphic = new VBox();
            firstNameLabel = createLabel("#66BB66");
            lastNameLabel = createLabel("#79A8D8");
            emailLabel = createLabel("#FF8888");
            graphic.getChildren().addAll(firstNameLabel, 
                    lastNameLabel, emailLabel);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        }

        private final Label createLabel(String color) {
            Label label = new Label();
            VBox.setVgrow(label, Priority.ALWAYS);
            label.setMaxWidth(Double.MAX_VALUE);
            label.setStyle("-fx-background-color: "+color+" ;");
            label.setAlignment(Pos.CENTER);
            return label ;
        }

        @Override
        public void updateItem(Person person, boolean empty) {
            if (person == null) {
                setGraphic(null);
            } else {
                firstNameLabel.setText(person.getFirstName());
                lastNameLabel.setText(person.getLastName());
                emailLabel.setText(person.getEmail());
                setGraphic(graphic);
            }
        }
    });
TableColumn multiCol=新的TableColumn(“多行”);
Multicl.setCellValueFactory(cellData->
新的ReadOnlyObjectWrapper(cellData.getValue());
multicl.setCellFactory(列->新表单元格(){
专用VBox图形;
自有品牌firstNameLabel;
自有品牌lastNameLabel;
自有品牌;
//匿名构造函数:
{
图形=新的VBox();
firstNameLabel=createLabel(#66BB66”);
lastNameLabel=createLabel(#79A8D8”);
emailLabel=createLabel(“FF8888”);
graphic.getChildren().addAll(firstNameLabel,
lastNameLabel、emailLabel);
setContentDisplay(仅限ContentDisplay.GRAPHIC_);
}
专用最终标签createLabel(字符串颜色){
标签=新标签();
setVgrow(标签、优先级、始终);
label.setMaxWidth(双倍最大值);
label.setStyle(“-fx背景色:“+color+”;”);
标签设置对齐(位置中心);
退货标签;
}
@凌驾
public void updateItem(Person,布尔值为空){
if(person==null){
设置图形(空);
}否则{
firstnamelab.setText(person.getFirstName());
setText(person.getLastName());
emailLabel.setText(person.getEmail());
设置图形(图形);
}
}
});
    TableColumn<Person, Person> multiCol = new TableColumn<>("Multiline");
    multiCol.setCellValueFactory(cellData -> 
        new ReadOnlyObjectWrapper<Person>(cellData.getValue()));
    multiCol.setCellFactory(column -> new TableCell<Person, Person>() {

        private VBox graphic ;
        private Label firstNameLabel ;
        private Label lastNameLabel ;
        private Label emailLabel ;

        // Anonymous constructor:
        {
            graphic = new VBox();
            firstNameLabel = createLabel("#66BB66");
            lastNameLabel = createLabel("#79A8D8");
            emailLabel = createLabel("#FF8888");
            graphic.getChildren().addAll(firstNameLabel, 
                    lastNameLabel, emailLabel);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        }

        private final Label createLabel(String color) {
            Label label = new Label();
            VBox.setVgrow(label, Priority.ALWAYS);
            label.setMaxWidth(Double.MAX_VALUE);
            label.setStyle("-fx-background-color: "+color+" ;");
            label.setAlignment(Pos.CENTER);
            return label ;
        }

        @Override
        public void updateItem(Person person, boolean empty) {
            if (person == null) {
                setGraphic(null);
            } else {
                firstNameLabel.setText(person.getFirstName());
                lastNameLabel.setText(person.getLastName());
                emailLabel.setText(person.getEmail());
                setGraphic(graphic);
            }
        }
    });