Dynamic 调整列大小时调整文本字段宽度

Dynamic 调整列大小时调整文本字段宽度,dynamic,javafx,width,javafx-8,Dynamic,Javafx,Width,Javafx 8,我有一个treeTableView,在它的标题中有一个标签和文本框。我希望文本框的宽度也随着列大小的增加而增加 怎么做 如何获得动态列宽?或者如何根据列设置文本框的动态宽度 代码: JAVA代码: for (TableColumn<NonRepudiation, ?> tableColumn : tableView.getColumns()) { double width = tableColumn.getWidth(); VBox vBox = new VBox(); vB

我有一个treeTableView,在它的标题中有一个标签和文本框。我希望文本框的宽度也随着列大小的增加而增加

怎么做

如何获得动态列宽?或者如何根据列设置文本框的动态宽度

代码:


JAVA代码:

for (TableColumn<NonRepudiation, ?> tableColumn : tableView.getColumns()) {

double width = tableColumn.getWidth();

VBox vBox = new VBox();
vBox.autosize();
vBox.setPrefWidth(tableColumn.getMaxWidth());

double width = tableColumn.getWidth();

VBox vBox = new VBox();
vBox.autosize();
vBox.setPrefWidth(tableColumn.getMaxWidth());

HBox lableBox = new HBox();
lableBox.setPrefWidth(width);
lableBox.getStyleClass().add("labelBoxTxt");

StackPane HL    =   new StackPane();
HL.getStyleClass().add("greyBorder");

Label label = new Label(tableColumn.getText());
label.setPrefWidth(width);
label.alignmentProperty().setValue(Pos.TOP_LEFT);

TextField textField = new TextField();
textField.setPrefWidth(width);
textField.textProperty().addListener(filterTable(tableColumn));

HBox textInputBox = new HBox();
textInputBox.getChildren().add(textField);
lableBox.getChildren().add(label);

HBox.setMargin(textField, new Insets(3,3,3,0));

vBox.getChildren().addAll(lableBox, HL, textInputBox);

tableColumn.setGraphic(vBox);
}
for(TableColumn TableColumn:tableView.getColumns()){
double width=tableColumn.getWidth();
VBox VBox=新的VBox();
vBox.autosize();
setPrefWidth(tableColumn.getMaxWidth());
double width=tableColumn.getWidth();
VBox VBox=新的VBox();
vBox.autosize();
setPrefWidth(tableColumn.getMaxWidth());
HBox标签盒=新的HBox();
lableBox.setPrefWidth(宽度);
lableBox.getStyleClass().add(“labelBoxTxt”);
StackPane HL=新的StackPane();
HL.getStyleClass().add(“greyBorder”);
Label Label=新标签(tableColumn.getText());
label.setPrefWidth(宽度);
label.alignmentProperty().setValue(位置左上方);
TextField TextField=新的TextField();
textField.setPrefWidth(宽度);
textField.textProperty().addListener(filterTable(tableColumn));
HBox textInputBox=新的HBox();
textInputBox.getChildren().add(textField);
lableBox.getChildren().add(标签);
HBox.setMargin(文本字段,新插图(3,3,3,0));
vBox.getChildren().addAll(lableBox、HL、textInputBox);
tableColumn.setGraphic(vBox);
}

基本上,您需要使用
HBox.setHgrow()
方法。下面是您的重构代码:

for ( TableColumn tableColumn : tableView.getColumns() ) {

    // build label
    Label label = new Label( tableColumn.getText() );
    HBox lableBox = new HBox( label );
    lableBox.getStyleClass().add( "labelBoxTxt" );
    lableBox.setAlignment( Pos.CENTER );

    // build hor line
    StackPane HL = new StackPane();
    HL.getStyleClass().add( "greyBorder" );

    // build text field
    TextField textField = new TextField();
    HBox.setHgrow( textField, Priority.ALWAYS );
    HBox.setMargin( textField, new Insets( 3 ) );
    HBox textInputBox = new HBox( textField );

    // put together
    VBox vBox = new VBox( lableBox, HL, textInputBox );
    tableColumn.setText( "" );
    tableColumn.setGraphic( vBox );
}
我找到了解决办法

将css类设置为talbe视图

<TableView styleClass="k-table-view"
添加css规则

    .k-table-view .column-header > .label  {
    -fx-content-display: graphic-only;
}

.k-column-graphic {
    -fx-alignment: center-left;
}

我有图形的动态宽度。

Hm,怎么做?列宽是多少?一个屏幕截图和一段代码将有助于找到解决方案。你发布的代码中没有标签和文本框。谢谢你,伙计。正如我所预料的那样。万岁。好的,我们可以用别的东西吗--tableColumn.setText(“”?我有以下代码--tableView.setTableMenuButtonVisible(true);--。如果我将该文本设置为null或空,则标题文本不会显示在下拉列表中。只有复选框出现。@php83,嗯,那么您需要使用include setText()重新设计tablecolumn的视觉效果。默认情况下,文本显示在右侧,而图形显示在左侧。如果您想垂直对齐它们,您可能需要访问(通过查找)tablecolumn的标记节点,并相应地设置(可能通过覆盖css选择器)其contentDisplayProperty。我已经尝试过,但无法实现。请你创建一些代码或示例,说明应该如何做。我们有上面的代码。它是否适用于您在注释->中的上一个问题“我有此代码--tableView.setTableMenuButtonVisible(true);--。如果我将该文本设置为null或空,则标题文本不会显示在下拉列表中。只显示复选框。”?因为你只显示图形。在我写下这个css规则之后。我能够实现我所追求的目标。
vBox.getStyleClass().add("k-column-graphic");
    .k-table-view .column-header > .label  {
    -fx-content-display: graphic-only;
}

.k-column-graphic {
    -fx-alignment: center-left;
}