Не могу добавить данные в таблицу

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);
        }
    }
→ Ссылка