Как установить значение в TableView <> из Entity, используя JavaFX - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь реализовать следующую JavaFX против Spring реализацию, но не могу понять, как работать и отображать сущность в форме TableView.(Я имею в виду Gender класс. Это просто сущность, представляющая таблицу, которая может содержать только два значения: male или female - и я хочу отобразить это значение в TableView)

Персона:

@Entity
@Table(name = "passport_data")
public class Person {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(name = "ipn", unique = true)
  private long ipn;

  @One_to_One
  private Gender gender;
//getters & setters
}

Пол

  @Entity
  @Table(name = "gender")

public class Gender {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "gender")
    String gender;
//getters & setters
}

В MainController классе я реализую TableView<> для отображения и редактирования данных таблицы:

Контроллер:

public class MainController {

    @FXML private TableView<Person> table;

    @FXML private TextField ipnTxt; //Long data in Person entity
    @FXML private TextField genderTxt; //Other entity (Gender) in Person entity

private ObservableList<Person> data;

@PostConstruct
public void init(){
    List<Person> personList = personService.getAllPerson();
    data = FXCollections.observableArrayList(personList);

    TableColumn<Person, String> ipnColumn = new TableColumn<>("IPN");
    ipnColumn.setCellValueFactory(new PropertyValueFactory<>("ipn"));

    TableColumn<Person, String> genderColumn = new TableColumn<>("Gender");
    genderColumn.setCellValueFactory(new PropertyValueFactory<>("gender"));

    table.getColumns().setAll(ipnColumn, genderColumn);
    table.setItems(data);
}

.fxml файл * Часть, в которой отображается таблица выполнения:

<TableView fx:id="table" editable="true" prefHeight="200.0" prefWidth="405.0" tableMenuButtonVisible="true" AnchorPane.bottomAnchor="50.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0">
            <columnResizePolicy><TableView fx:constant="CONSTRAINED_RESIZE_POLICY" /></columnResizePolicy>
        </TableView>
        <HBox alignment="CENTER" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="10.0" AnchorPane.rightAnchor="10.0">
            <children>
                <!--<TextField fx:id="id" promptText="ID">-->
                    <!--<HBox.margin>-->
                        <!--<Insets right="3.0"/>-->
                    <!--</HBox.margin>-->
                <!--</TextField>-->
                <TextField fx:id="ipnTxt" promptText="IPN">
                    <HBox.margin>
                        <Insets right="3.0"/>
                    </HBox.margin>
                </TextField>
                <TextField fx:id="genderTxt" promptText="Gender">
                    <HBox.margin>
                        <Insets right="3.0"/>
                    </HBox.margin>
                </TextField>
                <Button minWidth="-Infinity" mnemonicParsing="false" onAction="#addPerson" text="Add" />
            </children>
        </HBox>

Итак, в результате у меня есть данные из столбца IPN и ссылка на объект Gender в столбце gender:

enter image description here

Но мне нужнополучить значение String gender из этих объектов.Как получить и поместить значение из объекта в этом случае?

Дополнительная информация

Класс Full Person

package com.production.weighlifting.weightliftingviewer.model.domain;

import javax.persistence.*;
import java.sql.Date;

@Entity
@Table(name = "passport_data")
public class Person {

  @Id
  @Column(name = "id")
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private long id;

  @Column(name = "ipn", unique = true)
  private long ipn;

  @Column(name = "passport_number", unique = true)
  private String passportNumber;

  @Column(name = "name")
  private String name;

  @Column(name = "last_name")
  private String lastName;

  @Column(name = "born")
  private java.sql.Date born;

  public String genderValue;

  @OneToOne
//  @Column(name = "gender_id")
  private Gender gender;

  public Person(){

  }

  public Person(long ipn, String passportNumber, String name, String lastName, Date born, Gender gender) {
    this.ipn = ipn;
    this.passportNumber = passportNumber;
    this.name = name;
    this.lastName = lastName;
    this.born = born;
    this.gender = gender;
    this.genderValue = gender.getGender();
  }

  public long getId() {
    return id;
  }

  public void setId(long id) {
    this.id = id;
  }


  public long getIpn() {
    return ipn;
  }

  public void setIpn(long ipn) {
    this.ipn = ipn;
  }


  public String getPassportNumber() {
    return passportNumber;
  }

  public void setPassportNumber(String passportNumber) {
    this.passportNumber = passportNumber;
  }


  public String getName() {
    return name;
  }

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


  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }


  public java.sql.Date getBorn() {
    return born;
  }

  public void setBorn(java.sql.Date born) {
    this.born = born;
  }

  public Gender getGender() {
    return gender;
  }

  public void setGender(Gender gender) {
    this.gender = gender;
  }

  public String getGenderValue(){return genderValue;}
}

Полный класс Gender

@Entity
@Table(name = "gender")
public class Gender {

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "gender")
    private String gender;

    public Gender(){

    }

    public long getId() {
        return id;
    }

    public Gender(GenderEnum genderEnum) {
        this.gender = genderEnum.name();
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
}

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Просто реализуйте cellValueFactory по своему усмотрению:

TableColumn<Person, String> genderColumn = new TableColumn<>("Gender");
// genderColumn.setCellValueFactory(new PropertyValueFactory<>("gender"));
genderColumn.setCellValueFactory(cd -> new SimpleStringProperty(cd.getValue().getGender().getGender()));

В качестве альтернативы вы можете использовать cellFactory, чтобы настроить отображение объекта Gender:

public class GenderTableCell<T> extends TableCell<T, Gender> {
    @Override
    protected void updateItem(Gender item, boolean empty) {
        super.updateItem(item, empty);
        setText(empty || item == null ? "" : item.getGender());
    }
}

Вместо этого вы можете использовать метод updateItem, например, для обновления ImageView, используемого как TableCell.graphic для отображения гендерных символов ...

TableColumn<Person, Gender> genderColumn = new TableColumn<>("Gender");
genderColumn.setCellValueFactory(new PropertyValueFactory<>("gender"));
genderColumn.setCellFactory(col -> new GenderTableCell<>());
0 голосов
/ 23 ноября 2018

Вы пытаетесь отобразить вложенное значение.JavaFx не обеспечивает явную обработку вложенных значений, таких как person.gender.Вам необходимо добавить метод получения к Person, который будет выступать в качестве поставщика Gender String.Кстати - хотя это работает, использование PropertyValueFactory - не лучший выбор.

public class Gender {

    private String value;

    public Gender(String value) {
        this.value = value;
    }

    public String getGender() {
        return value;
    }
}

public class Person {

    private String name;
    private Gender gender;

    public Person(String name, Gender gender) {
        this.name = name;
        this.gender = gender;
    }

    public String getName() {
        return name;
    }

    public Gender getGender() {
        return gender;
    }

    public String getGenderValue() {
        return gender.getGender();
    }
}

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class NestedPropertyApp extends Application {

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

    @Override
    public void start(Stage stage) throws Exception {

        ObservableList<Person> persons = FXCollections.observableArrayList();
        persons.add(new Person("Peter", new Gender("Male")));

        TableView<Person> tableView = new TableView<>(persons);

        TableColumn<Person, String> nameColumn = new TableColumn<>("Name");
        nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));

        TableColumn<Person, String> genderColumn = new TableColumn<>("Gender");
        genderColumn.setCellValueFactory(new PropertyValueFactory<>("genderValue"));

        tableView.getColumns().add(nameColumn);
        tableView.getColumns().add(genderColumn);

        stage.setScene(new Scene(tableView));
        stage.show();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...