Могу ли я разместить TextField в столбце заголовка TableView на javafx 2

Я новичок в javafx. Может ли кто-нибудь помочь мне добавить несколько текстовых полей в заголовок TableView. Я пробую поместить TableView в стек и разместить над ним текстовые поля с помощью интеграции css. Не может добиться успеха.


person ajeshbaby    schedule 09.05.2012    source источник


Ответы (1)


Да, ты можешь это сделать.

Для JavaFX 2.2

В JavaFX 2.2 (jdk7u6 +) была реализована jira RT-14909, которая позволяет установить изображение (произвольный узел) в столбце, чтобы указать заголовок таблицы для столбца.

TableColumn col = new TableColumn("");
TextField colHeaderTextField = new TextField("Pink Elephants");
col.setGraphic(colHeaderTextField);

Для JavaFX 2.0 и 2.1

После того, как вы добавили таблицу в активную сцену и она была отрисована, вы можете найти метки заголовков таблицы и изменить их, чтобы отобразить графику (который может быть любым типом узла), который отображает текстовые поля для заголовков таблицы, а не значения по умолчанию. статический текст метки.

Вот образец:

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.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"));

    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); }
  }
}
person jewelsea    schedule 10.05.2012
comment
Большое спасибо, jewelsea. Я твой фанат. Раньше я был разработчиком веб-приложений, использующим spring & jsf. Я впечатлил ваши блоги wordpress и собираюсь перейти к javafx, даже если javafx имеет много ограничений (теперь все равно, потому что javafx новичок). Я застрял в вашем календаре jquery как трюк с веб-просмотром, хорошо. Мне нравится jquery, надеюсь интегрировать всю мощь jquery для создания шаблонов javafx. Очевидно, я объяснил, что моя цель - разработать TableView с фильтром в заголовке таблицы, например, в jquery-реализации Primefaces. Именно это, primefaces.org/showcase-labs/ui/datatableFiltering.jsf - person ajeshbaby; 10.05.2012
comment
for (Node n: table.lookupAll (.column-header ›.label)) {if (n instanceof Label) {Label label = (Label) n; TextField textField = новое текстовое поле (label.getText ()); label.textProperty (). bind (textField.textProperty ()); label.setGraphic (текстовое поле); label.setContentDisplay (ContentDisplay.GRAPHIC_ONLY); }} .. Я пробую label.setGraphic (textField); и label.setText (label.getText); Не работают оба (графика и текст). В противном случае я пытаюсь разместить текст и текстовое поле на VBox и label.setGraphics (VBox), ошибка .. - person ajeshbaby; 13.05.2012
comment
Я пробую другой подход, это не очень хорошо. Поместите TableView в StackPane и создайте HBox с TextField, соответствующим столбцам TableView. В css сделайте двойную высоту заголовка (.table-view .column-header {-fx-size: 56px;}) и поместите этот HBox выше в часть заголовка TableView. Но, к сожалению, я не могу исправить tableview для каждой ширины заголовка столбца, и каждая ширина TextField имеет одинаковый размер. - person ajeshbaby; 13.05.2012
comment
Это не работает. Я все еще вижу старые этикетки. Более того, при настройке 2.2 графика не будет работать, так как размер столбца будет отключен. - person Adam Arold; 30.01.2018
comment
Я не понимаю, о чем вы говорите, Адам. Я запустил код, используя оба метода на JavaFX 9.0.4, и мне показалось, что они отлично работают. Я не знаю, что вы имеете в виду, я все еще вижу старые метки (я не уверен, что это за старые метки) или размер столбца будет отключен (размер мне кажется правильным). - person jewelsea; 30.01.2018