JavaFX 8 : TableColumn setPrefWidth doing nothing if user manually resizes the column

标签 javafx resize tableview

我需要让我的用户能够在 JavaFX 8 中调整 TableView 的列的大小。

这是代码的简化版本:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class TableViewSample extends Application {

private TableView table = new TableView();
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage stage) {
    Scene scene = new Scene(new Group());
    stage.setTitle("Table View Sample");
    stage.setWidth(300);
    stage.setHeight(500);

    final Label label = new Label("Address Book");

    label.setFont(new Font("Arial", 20));

    table.setEditable(true);

    TableColumn firstNameCol = new TableColumn("First Name");
    TableColumn lastNameCol = new TableColumn("Last Name");

    final Button button = new Button("Resize!");
    button.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent e) {
            System.out.println("Pref Width before resizing: "+firstNameCol.getPrefWidth());
            System.out.println("Width before resizing: "+firstNameCol.getWidth());
            firstNameCol.setPrefWidth(100);
            System.out.println("Pref Width after resizing: "+firstNameCol.getPrefWidth());
            System.out.println("Width after resizing: "+firstNameCol.getWidth());
        }

    });
    table.getColumns().addAll(firstNameCol, lastNameCol);

    final VBox vbox = new VBox();
    vbox.setSpacing(5);
    vbox.setPadding(new Insets(10, 0, 0, 10));
    vbox.getChildren().addAll(label,button, table);

    ((Group) scene.getRoot()).getChildren().addAll(vbox);

    stage.setScene(scene);
    stage.show();
}
}

如果您单击该按钮,第一列会调整大小。如果您手动调整第一列的大小然后单击按钮,则第一列不会调整大小并且 getWidth 和 getPrefWidth 返回不同的值!

我知道这是一个“首选”宽度,但没有“setWidth”方法,只有“getWidth”。

如果我设置了 maxWidth 和 minWidth,列就不能再调整大小了,所以我不能使用这些方法。

有谁知道如何设置列的有效宽度?

最佳答案

解决方案是同时设置最小和最大宽度,然后立即将它们设置回“默认”值。

column.setPrefWidth(newWidth);
column.setMinWidth(newWidth);
column.setMaxWidth(newWidth);

column.setMinWidth(0);
column.setMaxWidth(5000);

这样,前三个指令强制调整列的大小并保持正确的宽度;最后两条指令确保该列仍然可以以任何方式调整大小。

关于JavaFX 8 : TableColumn setPrefWidth doing nothing if user manually resizes the column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33348757/

相关文章:

ios - 更改tableview中所有单元格按钮的颜色

java - JXBrowser navigator.languages 始终为空

php - ImageMagick 不正确的尺寸

ios - 在带有标签的 TableView 中添加自定义按钮

iphone - 为什么我的 tableView 没有加载?

c# - 如何根据文本调整按钮大小

javafx - 如何在JavaFx中绑定(bind)TextField和ProgressBar

java - 绘制平滑色标并为其分配特定值

java - 在两个 JavaFX Controller 之间传递参数

java - 如何在 Java 中正确设置最小尺寸?