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