具有水平滚动功能的 JavaFX 8 Tableview

JavaFX 8 Tableview with horizontal scrolling

如何让水平滚动条出现而不是将所有列压缩到最小尺寸?您还应该仍然能够不受约束地调整列的大小(并调整水平滚动条)。

要使列采用他们喜欢的大小而不是挤压到可用的屏幕大小,您可以将 columnResizePolicy 设置为 UNCONSTRAINED_RESIZE_POLICY

tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY); 

由于这是默认行为,您必须在某处将 columnResizePolicy 设置为 CONSTRAINED_RESIZE_POLICY


更新

这是一个 MCVE,展示了如何在 TableView 中获得水平滚动条。你可以看到我没有设置 columnResizePolicy 因为 UNCONSTRAINED_RESIZE_POLICY 是由 default 设置的。

添加 MCVE 更清晰:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

import java.util.stream.IntStream;

public class Test extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        TableView<Person> tableView = new TableView<>();
        tableView.setTableMenuButtonVisible(true);
        IntStream.range(0, 15).forEach(value -> {
            TableColumn<Person, String> tableColumn = new TableColumn<>("TableColumn" + value);
            tableColumn.setPrefWidth(100.0);
            tableView.getColumns().add(tableColumn);
        });

        IntStream.range(1, 10).forEach(value -> {
            Person person = new Person("Person" + value, value);
            tableView.getItems().add(person);
        });
        Scene scene = new Scene(new StackPane(tableView));
        stage.setScene(scene);
        stage.setWidth(500);
        stage.setHeight(500);
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }

    private class Person {
        private String name;
        private int age;

        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

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

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}