TableView does not always resize the columns

2019-06-03 16:05发布

I have a TableView with CONSTRAINED_RESIZE_POLICY column resize policy. It works great when I resize the window manually, but when I maximize it or restore it from a maximized state, the columns do not adjust.

Is there a way to force a "refresh" on the TableView so columns resize in these cases?

UPDATE: Sample compilable code to reproduce the issue

public class TableViewResizeTest extends Application {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {
    launch(args);
}

@Override
public void start(Stage primaryStage) {

    primaryStage.setTitle("TableView resize demo");

    ObservableList<Room> roomsList = FXCollections.observableArrayList();

    final TableView rooms = new TableView();
    TableColumn icons = new TableColumn();
    TableColumn name  = new TableColumn("Name");
    TableColumn topic = new TableColumn("Topic");
    TableColumn users = new TableColumn("Users");

    rooms.getColumns().addAll(icons, name, topic, users);

    name.setCellValueFactory( new PropertyValueFactory<Room,String>("name"));
    topic.setCellValueFactory( new PropertyValueFactory<Room,String>("topic"));
    users.setCellValueFactory( new PropertyValueFactory<Room,String>("users"));
    icons.setCellValueFactory( new PropertyValueFactory<Room,String>("icons"));

    name.setMinWidth(50);
    name.setMaxWidth(450);
    topic.setMinWidth(10);
    users.setMinWidth(100);
    users.setMaxWidth(150);

    icons.setMaxWidth(35);
    icons.setMinWidth(35);
    // Room resize policy, this is almost perfect
    rooms.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

    for (int i = 1; i<50; i++) roomsList.add(new Room("Sample Room "+i));
    rooms.setItems(roomsList);
    BorderPane root = new BorderPane();
    root.setCenter(rooms);
    primaryStage.setScene(new Scene(root, 500, 460));
    primaryStage.show();

}

public class Room {

    public Room(String name) {

        this.name = new SimpleStringProperty(name);
        this.topic= new SimpleStringProperty("This is a sample description text");
        this.icon= new SimpleStringProperty("");
        nUsers = (int)(Math.random()*1000);
        this.users= new SimpleStringProperty(nUsers.toString());
    }    

    Integer nUsers;

    private SimpleStringProperty name;
    private SimpleStringProperty topic;
    private SimpleStringProperty users;
    private SimpleStringProperty icon;


    public String getName() {
        return name.get();
    }

    public void setName(String name) {
        this.name.set(name);
    }

    public String getTopic() {
        return topic.get();
    }

    public void setTopic(String topic) {
        this.topic.set(topic);

    }

    public String getUsers() {
        return nUsers.toString();
    }

    public void setUsers(String users) {
        this.users.set(users);
    }


    public String getIcon() {
        return icon.get();
    }

    public void setIcon(String icon) {
        this.icon.set(icon);
    }
}   

}

According to the resize policy, the last column "Users" must be visible at all times, and if you resize the form manually it works fine. But if you try maximizing and restoring a couple of times, you will see that it comes off view, until you resize the window a bit manually.

1条回答
Fickle 薄情
2楼-- · 2019-06-03 16:22

I suppose you want to constraint the name, users and icon columns with max and min width boundaries, while the topic column takes the rest of free space. As a workaround I suggest to put the topic column to the end of columns, i.e. rooms.getColumns().addAll(icons, name, users, topic);.

查看更多
登录 后发表回答