JavaFX TableView自定义标头

时间:2018-04-23 06:10:37

标签: javafx tableview

我正在自定义JavaFX TableView的标头。 因此,我向Graphic添加Label。点击header i的标签切换我的自定义header(两个内衬)。这一切都很好。

标题会自动调整大小,以便自定义header适合。 但是,当我隐藏自定义header时,header会保持较大。

我缺少什么,所以header再次缩小?

我创建了一个MCVE来演示我的问题:

public class TableViewHeaderMCVE extends Application {

    private final TableView<Person> table = new TableView<>();

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

    @Override
    public void start(Stage stage) {
        final VBox root = new VBox();
        Scene scene = new Scene(root);
        stage.setWidth(218);
        stage.setHeight(216);

        TableColumn colName = new TableColumn("name");
        colName.setMinWidth(100);
        colName.setSortable(false);

        TableColumn colProfession = new TableColumn("profession");
        colProfession.setMinWidth(100);
        colProfession.setSortable(false);

        table.getColumns().addAll(colName, colProfession);

        root.getChildren().addAll(table);

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

        // apply this after show!
        TableViewHeader.installMod(table);
    }

    public static class TableViewHeader {
        public static void installMod(TableView table) {
            for (Node n : table.lookupAll(".column-header > .label")) {
                if (n instanceof Label) {
                    new CustomHeaderLabel((Label) n);
                }
            }
        }
    }

    public static class CustomHeaderLabel extends BorderPane {

        protected Label customNode = null;
        BooleanProperty expanded = new SimpleBooleanProperty(this, "expanded", false);

        public CustomHeaderLabel(final Label parent) {
            Label label = new Label(parent.getText());

            // custom MenuButton
            Button btn = new Button();
            btn.setGraphic(new Label("\u2261"));
            btn.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            btn.setOnAction(new EventHandler<ActionEvent>() {

                @Override
                public void handle(ActionEvent ae) {
                    System.out.println("Hello World");
                }

            });

            TextField filterTextField = new TextField();
            filterTextField.promptTextProperty().set("type here to filter");

            setCenter(label);
            setRight(btn);
            setBottom(filterTextField);

            EventHandler<MouseEvent> toggleHeader = new EventHandler<MouseEvent>() {

                @Override
                public void handle(MouseEvent me) {
                    expanded.set(!expanded.get());
                }

            };
            parent.setOnMouseClicked(toggleHeader);
            expanded.addListener(new ChangeListener<Boolean>() {

                @Override
                public void changed(ObservableValue<? extends Boolean> obs, Boolean oldValue, Boolean value) {
                    showCustomHeader(value);
                }

            });

            label.textProperty().bind(parent.textProperty());
            parent.setGraphic(this);

            customNode = parent;
            showCustomHeader(expanded.get());
        }

        protected void showCustomHeader(Boolean value) {
            if (value) {
                customNode.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            } else {
                customNode.setContentDisplay(ContentDisplay.TEXT_ONLY);
            }
        }
    }

    public static class Person {

        private final SimpleStringProperty name;
        private final SimpleStringProperty profession;

        private Person(String name, String profession) {
            this.name = new SimpleStringProperty(name);
            this.profession = new SimpleStringProperty(profession);
        }

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

        public String getProfession() {
            return profession.get();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

感谢@James_D的回复。

在他回复后我在另一台计算机上测试了代码

适用于:

  • Windows 10上的JDK 1.8.0_161
  • Mac OS X上的JDK 9.0.4和JDK 10

失败:

  • Windows 7上的JDK 1.8.0_66-b18