Заполнить Tableview полями суперкласса - PullRequest
0 голосов
/ 17 июня 2020

У меня есть несколько классов, которые наследуются от одного super класса, которым необходимо заполнить несколько TableView связанных с их классом.

Суперкласс является абстрактным, а некоторые из методов получения и установки являются окончательными но все еще содержит данные, необходимые для заполнения ячеек.

Написание нового класса обратного вызова для каждого столбца выполнимо, но я ищу способ реализовать это.

пример кода

class SuperClass
{
  protected String name;
  protected double value;
  public final void setName(String name)
  {
    this.name = name;
  }
  public final void getName()
  {
    return this.name;
  }
  public final void setValue(double value)
  {
    this.value = value;
  }
  public double getValue()
  {
    return this.value;
  }
}
class SubClass1 extends SuperClass
{
  private int id;
  public void setId(int id)
  {
    this.id = id;
  }
  public int getId()
  {
    return this.id;
  }
}
class SubClass2 extends SuperClass
{
  private String location;
  public void setLocation(String location)
  {
    this.location = location;
  }
}
class SubClass3 extends SuperClass
{
  private ObservableMap<SuperClass> map;
  public ObservableMap<SuperClass> map()
  {
    return this.map;
  }
}

TableView

TableColumn<SubClass1, Integer> tc1_id;
TableColumn<SubClass1, String> tc1_name;
TableColumn<SubClass1, Double> tc1_value;
TableColumn<SubClass2, String> tc2_loc;
TableColumn<SubClass2, String> tc2_name;
TableColumn<SubClass2, Double> tc2_value;
TableColumn<SubClass3, String> tc3_name;
TableColumn<SubClass3, Double> tc3_value;

Вот ссылка на то, что я собирался сделать ... Доступ к свойствам подкласса в JavaFX TableView ObservableArrayList

Но просто с помощью примера кода я в основном переписываю 2 метода, по 3 раза каждый ... и в реальной программе есть немного больше. (Еще немного)

1 Ответ

1 голос
/ 17 июня 2020

Я думаю, вы просто спрашиваете, как уменьшить объем кода, который вам нужно написать. Решение такое же, как и для любого такого вопроса: напишите метод, который выполняет повторяющуюся часть, и параметризуйте его с помощью различных частей. Итак, в этом случае вам просто нужно написать общий c служебный метод для генерации столбцов таблицы, взяв заголовок столбца и функцию, которая создает свойство, необходимое фабрике значений ячеек.

Например, вы мог бы сделать что-то вроде

private <S,T> TableColumn<S,T> createColumn(String title, Function<S, Property<T>> prop) {
    TableColumn<S,T> column = new TableColumn<>(title);
    column.setCellValueFactory(cellData -> prop.apply(cellData.getValue()));
    return column ;
}

, а затем, если ваши классы модели используют свойства JavaFX, все, что вам нужно, это

TableColumn<SubClass1, Number> tc1Id = createColumn("Id", SubClass1::idProperty);

et c.

Если вы без использования свойств JavaFX (что является рекомендуемым подходом), вы все равно можете использовать

TableColumn<SubClass2, String> tc2Loc = 
    createColumn("Location", item -> new SimpleStringProperty(item.getLocation()));

или просто создать метод, который принимает Function<S,T> вместо Function<S,Property<T>>.

...