Не могу добавить данные в таблицу
package first.java;
import javafx.application.Application;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
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.scene.layout.FlowPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import java.io.IOException;
class Person{
private final SimpleStringProperty language;
private final SimpleStringProperty name;
private final SimpleIntegerProperty age;
Person(String language,String name,int age){
this.language=new SimpleStringProperty(language);
this.name=new SimpleStringProperty(name);
this.age=new SimpleIntegerProperty(age);
}
public String getLanguage(){ return language.get();}
public void setLanguage(String lng){ language.set(lng);}
public String getName(){ return name.get();}
public void setName(String n){ name.set(n);}
public int getAge(){ return age.get();}
public void setAge(int value){age.set(value);}
}
public class Task5 extends Application {
public void start(Stage stage) throws Exception {
ObservableList<Person> people = FXCollections.observableArrayList(
new Person("C", "Деннис Ритчи",1972),
new Person("C++", "Бьерн Страуструп",1983),
new Person("Python", "Гвидо Ван Россум",1991),
new Person("Java", "Джеймс Гослинг",1995),
new Person("JavaScript", "Брендон Айк",1995),
new Person("С#", "Андерс Хейлсберг",2001),
new Person("Scala", "Мартин Одерски",2003)
);
TableView<Person> table=new TableView<Person>(people);
table.setPrefWidth(450);
table.setPrefHeight(400);
TableColumn<Person,String> column1=new TableColumn<>("Язык");
TableColumn<Person,String> column2=new TableColumn<>("Автор");
TableColumn<Person,Integer> column3=new TableColumn<>("Год");
column1.setCellValueFactory(new PropertyValueFactory<Person,String>("language"));
column2.setCellValueFactory(new PropertyValueFactory<Person,String>("name"));
column3.setCellValueFactory(new PropertyValueFactory<Person,Integer>("age"));
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
FlowPane root=new FlowPane(10,10,table);
Scene scene = new Scene(root, 450, 400);
stage.setTitle("TableView");
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch();
}
}
В строках с setCellValueFactory возникаетс ошибка на этапе выполнения программы
WARNING:
Can not retrieve property 'language' in PropertyValueFactory:
javafx.scene.control.cell.PropertyValueFactory@77cf319e with provided class type:
class first.java.Person.lang.RuntimeException
Таблица выводится без данных.
Ответы (2 шт):
Автор решения: Roman C
→ Ссылка
Похоже, что неправильно определена фабрика пропертей. Попробуйте следующим образом:
TableColumn<Person, String> nameColumn = ...
PropertyValueFactory<Person, String> valueFactory = new PropertyValueFactory<>("language");
nameColumn.setCellValueFactory(valueFactory);
Чтобы использовать этот код, нужно определить метод
public final StringProperty languageProperty() { return language; }
Автор решения: Дмитрий Алексеенко
→ Ссылка
PropertyValueFactory<Person, String> замени на PropertyValueFactory<>
Так сделал у себя
@Override
public void start(Stage stage) throws Exception
{
ObservableList<Person> people = FXCollections.observableArrayList(
new Person("C", "Деннис Ритчи", 1972),
new Person("C++", "Бьерн Страуструп", 1983),
new Person("Python", "Гвидо Ван Россум", 1991),
new Person("Java", "Джеймс Гослинг", 1995),
new Person("JavaScript", "Брендон Айк", 1995),
new Person("С#", "Андерс Хейлсберг", 2001),
new Person("Scala", "Мартин Одерски", 2003)
);
TableView<Person> table = new TableView<Person>(people);
table.setPrefWidth(450);
table.setPrefHeight(400);
TableColumn<Person, String> column1 = new TableColumn<>("Язык");
TableColumn<Person, String> column2 = new TableColumn<>("Автор");
TableColumn<Person, Integer> column3 = new TableColumn<>("Год");
column1.setCellValueFactory(new PropertyValueFactory<>("language"));
column2.setCellValueFactory(new PropertyValueFactory<>("name"));
column3.setCellValueFactory(new PropertyValueFactory<>("age"));
table.getColumns().add(column1);
table.getColumns().add(column2);
table.getColumns().add(column3);
FlowPane root = new FlowPane(10, 10, table);
Scene scene = new Scene(root, 450, 400);
stage.setTitle("TableView");
stage.setScene(scene);
stage.show();
}
/**
* @param args the command line arguments
*/
public static void main(String[] args)
{
launch(args);
}
public class Person
{
final SimpleStringProperty language;
final SimpleStringProperty name;
final SimpleIntegerProperty age;
public Person(String language, String name, int age)
{
this.language = new SimpleStringProperty(language);
this.name = new SimpleStringProperty(name);
this.age = new SimpleIntegerProperty(age);
}
public String getLanguage()
{
return language.get();
}
public void setLanguage(String lng)
{
language.set(lng);
}
public String getName()
{
return name.get();
}
public void setName(String n)
{
name.set(n);
}
public int getAge()
{
return age.get();
}
public void setAge(int value)
{
age.set(value);
}
}