当前位置: 首页 > 知识库问答 >
问题:

JavaFX TableView与表列数组

郜谦
2023-03-14

我有一个表视图

我上这三门课是为了做报告:

public record DayCell(
        LocalDate date,
        DayType type
) {
    public String nameOfDay() {
        return DateTimeFormatter.ofPattern("EE", Locale.ENGLISH).format(date);
    }
}
public enum DayType {
    COMPASSIONATE_LEAVE("C"),
    EMPTY("E"),
    NOT_ON_PAYROLL("N"),
    QUARANTINE("Q"),
    REGULAR_LEAVE("R"),
    SICK_LEAVE("S"),
    TRAINING("TRG"),
    TRAVEL("T"),
    UNPAID_LEAVE("U");

    private final String shortName;

    DayType(String shortName) {
        this.shortName = shortName;
    }
}
public record MonthRow(
        String name,
        DayCell[] days // amount of days in that specific month
) {
}

然后我创建表内容:

public ObservableList<MonthRow> createMonth(int year) {
    MonthRow[] months = new MonthRow[12];
    for (int i = 0; i < months.length; i++) {
        LocalDate date = LocalDate.of(year, i + 1, 1);
        months[i] = new MonthRow(date.getMonth().getDisplayName(TextStyle.FULL, Locale.ENGLISH), createCells(date));
    }

    return FXCollections.observableArrayList(months);
}

public DayCell[] createCells(LocalDate date) {
    DayCell[] cells = new DayCell[date.lengthOfMonth()];

    for (int i = 0; i < cells.length; i++) {
        cells[i] = new DayCell(date.plusDays(i), DayType.EMPTY);
    }

    return cells;
}

现在有了TableView的可观察列表,我有点卡住了。我想要一个月的TableCollie和31个DayCell的TableColns。但是,因为它是一个数组,我不确定如何将每个DayCell的cell Data反映到每个TableCell中。此外,因为有些月份没有31天,因此,单元格不应该显示缺失天数的任何内容。

每个单元格应显示nameOfDay()内容和颜色,并根据DayType(将在相应的单元格工厂的某个时间进行)。

TableView示例

这可能是一个完全错误的方法,所以请不要犹豫,指导我找到一个不同的解决方案


共有1个答案

法景明
2023-03-14

您可以这样做:

TableView<MonthRow> table = new TableView<>();
TableColumn<MonthRow, String> monthColumn = new TableColumn<>("Month");
monthColumn.setCellValueFactory(cellData -> new SimpleStringProperty(cellData.getValue().getName()));
table.getColumns().add(monthColumn);

for (int i = 0; i < 31 ; i++) {
    TableColumn<MonthRow, DayCell> dayColumn = new TableColumn<>(Integer.toString(i+1));
    final int index = i ;
    dayColumn.setCellValueFactory(cellData -> {
        MonthRow month = cellData.getValue();
        if (index < month.getDays().size()) {
            return new SimpleObjectProperty<>(month.getDays()[index]);
        } else {
            return new SimpleObjectProperty<>(null);
        }
    });
    dayColumn.setCellFactory(new TableCell<>() {
        @Override
        protected void updateItem(DayCell day, boolean empty) {
            super.updateItem(day, empty);
            if (empty | day == null) {
                setText("");
            } else {
                setText(day.nameOfDay());
            }
        }
    });
    table.getColumns().add(dayColumn);
}

这可能是一种完全错误的方法

大概您是否需要此处的TableView功能?例如,选择月份(行)等?也许在滚动窗格中使用一个简单的网格窗格会是一种更方便的方法;这实际上取决于您的项目需求。

 类似资料:
  • 问题内容: 我已经进行了很多编程工作,最近开始学习更多纯粹的计算机科学主题(用于工作面试)。 我知道Array和LinkedList数据结构之间的区别,但是现在我已经开始使用Java,我看到了这个ArrayList,在概念上我遇到了麻烦。 网络搜索仅真正向我展示了如何使用它们以及何时使用它们(每种优点),但是没有任何东西可以回答我的问题: 什么是ArrayList?我的假设是,它是一个维护对每个元

  • 我创建了一个TableView,其中包含一个复选框列(isSelected)和三个信息列(姓名、姓氏、职务)。我想根据用户信息禁用一些复选框。例如,如果用户名为“Peter”,则Peter旁边的复选框将被禁用。但我不能。以下是我的一些代码: 人JAVA 控制器。JAVA

  • 列表字面量 包裹在()内并使用逗号分隔的项称为列表项。 其实并不需要使用小括号包裹列表项,这些列表项会自动声明自己的优先级。 译注: ("a", "b", 0); # 等同于 "a", "b", 0; 列表就是标量变量的有序集合,诸如: tutorial/arrays/list_literals.p6 #!/usr/bin/env perl6 use v6; (1, 5.2, "apple")

  • 问题内容: Varargs: 与 单数组参数: Java 1.6似乎接受/拒绝以下内容: 假设以上内容是正确的,为什么不总是使用varargs而不是单个数组参数呢?似乎免费增加了呼叫者的灵活性。 如果有,专家可以共享内部JVM的不同吗? 谢谢。 问题答案: 数组从Java的开始就出现了,而varargs是最近才添加的。因此,许多旧代码仍然很高兴地使用数组。 还要注意,使用显式数组参数调用通用var

  • 我正在尝试编写一个日历。我将我的约会保存在另一个ArrayList中的两个不同的ArrayList中。 字符串(Subject,Place,People)进入另一个ArrayList=arstr中的第一个ArrayList 整数(Date和Time)进入另一个ArrayList=arInt中的第二个ArrayList 当我创建约会时,我希望根据日期对其进行排序。所以如果我想添加一个新的约会,它应该

  • 问题内容: 如果要创建一维数组,则可以将其实现为列表,也可以使用标准库中的“数组”模块。我一直将列表用于一维数组。 我想改用数组模块的原因或情况是什么? 是为了性能和内存优化,还是我缺少明显的东西? 问题答案: 基本上,Python列表非常灵活,可以保存完全异构的任意数据,并且可以在摊销后的固定时间内非常高效地附加到它们。如果您需要高效而又省时地缩小和增加列表,则可以采用这些方法。但是它们 比C数