如何将文本字段插入到javafx表视图标题中? [英] How to insert text field to javafx table view header?

查看:63
本文介绍了如何将文本字段插入到javafx表视图标题中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个具有tableView的javafx的简单示例.我想在列标题标签下插入一个文本字段以过滤表数据.

I have a simple sample of javafx that have a tableView. I want to insert a text field under the column header label to filtering table data.

我找到了一个示例,但是我想同时具有标签和文本字段,但它插入了文本字段而不是标题标签:

I find an example for this, but it inserts text field instead of header label, while I want to have both of label and text field:

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class TableWithTextHeaders extends Application {
    public static void main(String[] args) { launch(args); }

    @Override 
    public void start(Stage stage) {
        TableColumn firstNameCol = new TableColumn("First Name");
        firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
        TableColumn lastNameCol = new TableColumn("Last Name");
        lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
        TableColumn searchCol = new TableColumn<>();

        TableView table = new TableView();
        table.getColumns().addAll(firstNameCol, lastNameCol);
        table.setItems(FXCollections.observableArrayList(
            new Person("Jacob", "Smith"),
            new Person("Isabella", "Johnson"),
            new Person("Ethan", "Williams")
        ));

        table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        StackPane layout = new StackPane();
        layout.setStyle("-fx-padding: 10;");
        layout.getChildren().add(table);
        Scene scene = new Scene(layout);
        stage.setScene(scene);
        stage.show();

        for (Node n: table.lookupAll(".column-header > .label")) {
            if (n instanceof Label) {
                Label label = (Label) n;
                TextField textField = new TextField(label.getText());                
                label.textProperty().bind(textField.textProperty());
                label.setGraphic(textField);
                label.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            }
        }
    }  

    public static class Person {
        private final SimpleStringProperty firstName;
        private final SimpleStringProperty lastName;

        private Person(String fName, String lName) {
            this.firstName = new SimpleStringProperty(fName);
            this.lastName = new SimpleStringProperty(lName);
        }

        public String getFirstName() { return firstName.get(); }
        public void setFirstName(String fName) { firstName.set(fName); }
        public String getLastName() { return lastName.get(); }
        public void setLastName(String fName) { lastName.set(fName); }
    }
}

但是我想对某些列而不是对所有列执行此操作.该怎么做?

However I want to do this to some of columns, not to all. How to do this?

推荐答案

您无需费心查找.只需在TableColumn:

You don't need to get your hands dirty with the lookup. Just set a graphic on the TableColumn:

TextField headerTextField = new TextField();
Label label = new Label("First Name");
VBox headerGraphic = new VBox();
headerGraphic.setAlignment(Pos.CENTER);
headerGraphic.getChildren().addAll(label, headerTextField);

TableColumn<Person, String> firstNameCol = new TableColumn<>();
firstNameCol.setGraphic(headerGraphic);

这篇关于如何将文本字段插入到javafx表视图标题中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆