在JavaFX中向表动态添加行

ldioqlga  于 2023-02-11  发布在  Java
关注(0)|答案(1)|浏览(273)

我尝试在一个类中读取CSV文件,该类循环遍历CSV文件的内容(采用第1列中的学生编号和第1题到第xAmount题的形式),并根据CSV文件中的行创建一个对象。在另一个类中,我正在创建一个表,并尝试使用CSV文件的内容动态填充该表。
到目前为止,我已经设置了它,以便根据CSV文件中的标题动态填充列,但是,每当遇到行时,它都会抛出一个错误:"警告:无法在PropertyValueFactory中检索属性'学生编号':javafx.scene.control.cell.PropertyValueFactory@76afc271具有提供的类类型:class java.lang.String "并对CSV文件中的每一列都执行此操作。是否有任何方法可以动态填充行?
下面是StudentCsv类的代码:

public class StudentCsv {
    private int[] marks;
    private String studentNumber;
    public StudentCsv(String studentNumber, int[] marks) {
        this.studentNumber=studentNumber;
        this.marks = marks;
    }
}

下面是tableView类的代码:
x一个一个一个一个x一个一个二个一个x一个一个三个一个
填充表时,其填充方式为

hvvq6cgz

hvvq6cgz1#

列的单元格值工厂是一个函数,它接受表示行的对象(一个StudentCsv,这是一个糟糕的类名),并返回一个ObservableValue,其中包含要在该行的该列中显示的值(即列中每个单元格中的值)。该函数应用于表中的每个可见行,以确定在列的单元格中显示的内容。
因此,单元格值工厂应该是一个函数,它接受一个Student,并返回一个ObservableValue,用于 Package 该列的值。第一列的单元格值工厂应该返回一个包含studentNumberObservableValue。其余列的单元格值工厂应该返回一个包含相应markObservableNumber
因此,您需要从studentNumbermarks的访问方法开始。

public class Student {
    private int[] marks;
    private String studentNumber;
    public Student(String studentNumber, int[] marks) {
        this.studentNumber=studentNumber;
        this.marks = marks;
    }

    public String getStudentNumber() {
        return studentNumber;
    }

    public int[] getMarks() {
        return marks;
    }
}

现在你的单元格值工厂可以为每一列返回合适的值了。我修正了这里的一些丑陋的代码。我不知道为什么你有一个名为studentNumber的字段,它是String(而不是某种数值类型),但我还是留了下来,以防有什么好的理由。

public class TableViewTest implements Initializable {
    @FXML
    private TableView<Student> tableView;
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        ArrayList<Student> testStudents = new ArrayList<>();

        Student student1 = new Student("40236387", new int[]{2, 3, 4, 5, 6});
        Student student2 = new Student("40236388", new int[]{7, 8, 9, 10, 11});
        Student student3 = new Student("40236388", new int[]{12, 13, 14, 15, 16});

        testStudents.add(student1);
        testStudents.add(student2);
        testStudents.add(student3);

        String[] columnNames = {"Student number", "q1", "q2", "q3", "q4", "q5"};

        ObservableList<Student> studentData = FXCollections.observableArrayList();
        studentData.addAll(testStudents);
        tableView.setItems(studentData);

        TableColumn<Student, String> studentNumberColumn = new TableColumn<>("Student number");
        studentNumberColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getStudentNumber()));
        tableView.getColumns().add(studentNumberColumn);

        for (int i = 1; i < columnNames.length; i++) {
            TableColumn<Student, Number> column = new TableColumn<>(columnNames[i]);
            final int marksIndex = i-1 ;
            column.setCellValueFactory(cellData ->
                    new SimpleIntegerProperty<>(cellData.getValue().getMarks()[marksIndex]));
            column.setPrefWidth(75);
            tableView.getColumns().add(column);
        }
    }
}

这是未经测试的,所以可能有错别字。

相关问题