#javafx #tableview
#javafx #javafx-2
Вопрос:
Я новичок в javafx. Кто-нибудь может помочь мне добавить несколько текстовых полей в заголовок TableView. Я пробую это, помещая TableView в stackpane и размещая текстовые поля над ним с помощью интеграции css. Не удается добиться успеха.
Ответ №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); }
}
}
Комментарии:
1. Большое вам спасибо jewelsea. Я твой поклонник. Прежде чем я стал разработчиком веб-приложений, использующим spring amp; jsf. Я впечатлил ваши блоги WordPress и собираюсь перейти на javafx, даже если javafx имеет много ограничений (сейчас все равно, потому что javafx новичок). Я застрял на вашем календаре jquery как на уловке webview, отлично. Мне нравится jquery, надеюсь интегрировать все возможности jquery для создания шаблонов javafx. Очевидно, я объяснил, что моя цель — разработать TableView с фильтром в tableheader, как реализация jquery Primefaces. Именно это, primefaces.org/showcase-labs/ui/datatableFiltering.jsf
2. для (Узел n: таблица. lookupAll(«.column-header> .label»)) { if (n instanceof Label) { Label label = (Label) n; Текстовое поле TextField = новое текстовое поле(label.getText()); label.TextProperty().bind(TextField.TextProperty()); label.setGraphic(текстовое поле); label.setContentDisplay(отображение содержимого. GRAPHIC_ONLY); } } .. Я пробую label.setGraphic(текстовое поле); и label.setText(label.getText); Не работают оба (графика и текст). В противном случае я пытаюсь поместить текст и текстовое поле в VBox и label.setGraphics (VBox), ошибка..
3. Я пробую другой подход, это нехорошо. Поместите TableView в StackPane и создайте HBox с текстовым полем, соответствующим столбцам TableView. В css сделайте двойную высоту заголовка (.table-view .column-header{-fx-size: 56px;}) и поместите этот HBox выше в часть заголовка TableView. Но, к сожалению, я не могу исправить ширину заголовка каждого столбца в таблице, и ширина каждого текстового поля имеет одинаковый размер.
4. Это не работает. Я все еще вижу старые метки. Более того, для 2.2 настройка графики не будет работать, поскольку размер столбца будет отключен.
5. Я не понимаю, о чем вы говорите, Адам. Я запустил код, используя оба метода в JavaFX 9.0.4, и мне показалось, что они работают нормально. Я не знаю, что вы подразумеваете под «я все еще вижу старые метки» (я не уверен, что это за старые метки) или «размер столбца будет отключен» (мне кажется, что размер подходит).