Java: TableColumn для 2 объектов: книга и автор - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть Книга и Автор:

 public Author(String name, Date dateOfBirth) {
                this.name=name;
                this.dateOfBirth = dateOfBirth;
    }

public Book(String isbn, String title, String category, int rating, Author author) {
        this.isbn = isbn;
        this.title = title;
        this.category = category;
        this.rating = rating;
        authors = new ArrayList<>();
        addAuthor(author); 
    }

Все, кроме авторов, отлично работает и показывает в таблице.Я хочу также показать имя автора в таблице, но столбец для него пуст при запуске программы.Могу ли я иметь два объекта в одной таблице?Как сделать так, чтобы в колонке «Автор» также отображались имена?(PS: у книги есть автор)


        booksTable = new TableView<>();
        booksTable.setEditable(true); 

        TableColumn<Book, String> titleCol = new TableColumn<>("Title");
        TableColumn<Book, String> isbnCol = new TableColumn<>("ISBN");
        TableColumn<Book, String> categoryCol = new TableColumn<>("Category");
        TableColumn<Book, Author> authorCol = new TableColumn<>("Author/s");
        TableColumn<Book, String> ratingCol = new TableColumn<>("Rating");

        booksTable.getColumns().addAll(titleCol, isbnCol, categoryCol,authorCol,ratingCol);

        titleCol.setCellValueFactory(new PropertyValueFactory<>("title"));
        isbnCol.setCellValueFactory(new PropertyValueFactory<>("isbn"));
        categoryCol.setCellValueFactory(new PropertyValueFactory<>("category"));
        authorCol.setCellValueFactory(new PropertyValueFactory<>("author"));
        ratingCol.setCellValueFactory(new PropertyValueFactory<>("rating"));
        booksTable.setItems(booksInTable);

1 Ответ

0 голосов
/ 05 декабря 2018

Ваш класс Author, по-видимому, не предоставляет никаких средств для передачи имени автора в TableColumn.

Один из методов - переопределить метод toString() в классе Author, как показанов приведенном ниже примере приложения.

Хотя при этом используются свойства JavaFX для полей экземпляра, концепция все та же:

import javafx.application.Application;
import javafx.beans.property.ObjectProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class LibrarySample extends Application {

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

    @Override
    public void start(Stage primaryStage) {

        // Simple interface
        VBox root = new VBox(5);
        root.setPadding(new Insets(10));
        root.setAlignment(Pos.CENTER);

        TableView<Book> tableView = new TableView<>();
        TableColumn<Book, String> colTitle = new TableColumn<>("Title");
        TableColumn<Book, Author> colAuthor = new TableColumn<>("Author");

        colTitle.setCellValueFactory(cellData -> cellData.getValue().titleProperty());
        colAuthor.setCellValueFactory(cellData -> cellData.getValue().authorProperty());

        tableView.getColumns().addAll(colTitle, colAuthor);

        // Sample books
        tableView.getItems().addAll(
                new Book("To Kill A Mockingbird", new Author("Harper Lee")),
                new Book("David Copperfield", new Author("Charles Dickens")),
                new Book("Moby Dick", new Author("Herman Melville"))

        );

        root.getChildren().add(tableView);

        // Show the Stage
        primaryStage.setWidth(500);
        primaryStage.setHeight(300);
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }
}

class Book {

    private final StringProperty title = new SimpleStringProperty();
    private final ObjectProperty<Author> author = new SimpleObjectProperty<>();

    public Book(String title, Author author) {
        this.title.set(title);
        this.author.set(author);
    }

    public String getTitle() {
        return title.get();
    }

    public StringProperty titleProperty() {
        return title;
    }

    public void setTitle(String title) {
        this.title.set(title);
    }

    public Author getAuthor() {
        return author.get();
    }

    public ObjectProperty<Author> authorProperty() {
        return author;
    }

    public void setAuthor(Author author) {
        this.author.set(author);
    }
}

class Author {

    private final StringProperty name = new SimpleStringProperty();

    public Author(String name) {
        this.name.set(name);
    }

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

    public StringProperty nameProperty() {
        return name;
    }

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

    // Here we will override the toString() method so that the author's name is displayed in the TableView
    @Override
    public String toString() {
        return name.get();
    }
}

Результат:

screenshot

...