【问题标题】:How to add n- custom cells between two rows如何在两行之间添加n个自定义单元格
【发布时间】:2019-01-10 03:46:53
【问题描述】:

所以我试图将课程可视化为表格。它应该如下所示:

如您所见,有一些自定义单元格 (+) 不是课程。它们是按钮。

我有两个班级:

public class Lesson {
  private Room schoolRoom;
  private Room teachingRoom;
  private TeacherSpecialization teachingInfo;
  private WeekDay weekDay;
  private int schoolHour;
}

public class ClassHour {

  Lesson[] dayLessons = new Lesson[18];
  private int hour;

  public ClassHour(int hour) {
    this.hour = hour;
  } 
}

使用此代码,我将我的课程对象转换为 ClassHour 对象,因为我使用 ClassHour 对象将课程保存在表中:

public ObservableList<ClassHour> convertToClassHour(List<Lesson> lessons) {
    ObservableList<ClassHour> classHours = FXCollections.observableArrayList();
    // Converting Lessons to ClassHour objects.
    lessons.forEach(lesson -> {
        ClassHour classHour = classHours.stream().filter(ch -> ch.getHour() == lesson.getSchoolHour()).findFirst().orElse(null);
        if (classHour == null) {
            classHour = new ClassHour(lesson.getSchoolHour());
            classHours.add(classHour);
        }
        classHour.getDayLessons()[lesson.getWeekDay().ordinal()] = lesson;
    });

    return classHours;
}

最后一步是在表格中显示数据:

private void showLessons(String roomNr) throws Exception {
    try {
        //    lessons.addListener((ListChangeListener) e -> repopulate(lessons, classHours));

        ArrayList<Lesson> allLessonsByRoomNr = db.getAllLessonsByRoomNr(roomNr);
        ObservableList<ClassHour> classHours = db.convertToClassHour(allLessonsByRoomNr);
        for (int i = 0; i < 5; i++) {
            int day = i;
            TableColumn<ClassHour, Lesson> dayColumn = new TableColumn<>(WeekDay.values()[i].name());
            dayColumn.setSortable(false);
            dayColumn.setCellValueFactory(param -> new SimpleObjectProperty(param.getValue().getDayLessons()[day]));
            dayColumn.setCellFactory((TableColumn<ClassHour, Lesson> param) -> new TableCell<ClassHour, Lesson>() {
                @Override
                protected void updateItem(Lesson item, boolean empty) {

                    super.updateItem(item, empty);
                    setText(null);
                    setGraphic(null);
                    if (!empty) {
                        if (item != null) {
                            setText(item.toString());
                        } else {
                            Button btn = new Button("+ ADD");
                            btn.setOnAction(e -> {
                                tableLessons.getSelectionModel().select((ClassHour) getTableRow().getItem());
                                showAdd(day, ((ClassHour) getTableRow().getItem()).getHour(), btn);
                            });
                            setGraphic(new StackPane(btn));
                        }
                    }
                }
            });
            tableLessons.getColumns().addAll(dayColumn);
        }
        tableLessons.setItems(classHours);

    } catch (Exception ex) {
        showResultDialog("An error has occured:", ex.getMessage());
    }
}

我正在努力解决的问题是自定义单元格(+ 按钮)。出于某种原因,我无法在两节课之间画出它们。在下面的例子中,在第 10 到 16 课时(星期一)之间应该有 5 个单元格/行。

【问题讨论】:

标签: uitableview javafx cell multiple-columns javafx-tableview


【解决方案1】:

请注意,您的convertToClassHour 创建一个ClassHour 实例当且仅当存在Lesson 并且如果Lessons 没有按小时排序,则输出中ClassHours 的顺序是错误的.

除非您有一组预先确定的小时数,否则您需要找到解决问题的最短和最长小时数:

public ObservableList<ClassHour> convertToClassHour(List<Lesson> lessons) {
    ObservableList<ClassHour> classHours = FXCollections.observableArrayList();

    if (!lessons.isEmpty()) {
        // find required hour range
        int minHour = lessons.mapToInt(Lesson::getSchoolHour).min().getAsInt();
        int maxHour = lessons.mapToInt(Lesson::getSchoolHour).max().getAsInt();

        // create ClassHours for range
        for (int i = minHour; i <= maxHour; i++) {
            classHours.add(new ClassHour(i));
        }
        // fill classHours with lessons
        for (Lesson lesson : lessons) {
            classHours.get(lesson.getSchoolHour() - minHour).getDayLessons()[lesson.getWeekDay().ordinal()] = lesson;
        }
    }

    return classHours;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 2022-01-09
    相关资源
    最近更新 更多