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

JavaFX:TableView用ObservableList中的特定数据填充列

公西俊才
2023-03-14

我正在为大学做一个项目。我刚刚学习了Java和JavaFX。

我有问题,也许有人能帮我。

有了这个小软件,你可以计划一周的任务。在tableview中,您有星期一到星期五的列。

我有一个数据库,在那里我可以获取对象“auftragsveretilung”(意思是任务,计划在特定日期)。这些对象有一个序列号(=seriennr)和一个日期(=bearbeitungsdatum)。

为了在tableview中填充一周,我从数据库中获取该周计划的所有任务。该周的任务保存在ObservableList RechnerWoChenAnsichtTabelle中。您可以从组合框中选择星期。这就是为什么我在组合框上有一个监听器。

现在我查看ObservableList并检查日期是否为星期一、星期四等,这样就可以了。但是,如果我编写col_rw_montag.setCellValueFactory(new PropertyValueFactory<>(“seriennr”)),则该列将获得保存在observableList中的所有序列号,但我需要从该特定日期开始的特定序列号。

如何才能从日期中得到具体的序列号,并用它填满栏目呢?

我希望你明白一切,因为这个项目是德语的。

请让我知道如果你需要进一步的信息或更多的代码。

public class Auftragsverteilung {

    private Date bearbeitungsdatum;
    private Integer seriennr;

    public Auftragsverteilung(Integer seriennr, Date bearbeitungsdatum) {
        super();
        this.seriennr = seriennr;
        this.bearbeitungsdatum = bearbeitungsdatum;
    }


    public Date getBearbeitungsdatum() {
        return bearbeitungsdatum;
    }

    public void setBearbeitungsdatum(Date bearbeitungsdatum) {
        this.bearbeitungsdatum = bearbeitungsdatum;
    }


    public Integer getSeriennr() {
        return seriennr;
    }

    public void setSeriennr(Integer seriennr) {
        this.seriennr = seriennr;
    }

}
public class RechneransichtController implements Initializable {

    @FXML
    private ComboBox<String> comboBox_RW_Wochenansicht;
    @FXML
    private TableView<Auftragsverteilung> tableRechnerWoche;
    @FXML
    private TableColumn<Auftragsverteilung, Integer> col_RW_Montag;
    @FXML
    private TableColumn<Auftragsverteilung, Integer> col_RW_Dienstag;
    @FXML
    private TableColumn<Auftragsverteilung, Integer> col_RW_Mittwoch;
    @FXML
    private TableColumn<Auftragsverteilung, Integer> col_RW_Donnerstag;
    @FXML
    private TableColumn<Auftragsverteilung, Integer> col_RW_Freitag;

    private Datenbank db = new Datenbank();

    ObservableList<Auftragsverteilung> rechnerWochenansichtTabelle = FXCollections.observableArrayList();

    public void wochenansichtFuellen() {

        // ComboBox Listener
        comboBox_RW_Wochenansicht.getSelectionModel().selectedItemProperty().addListener((options) -> {
        tableRechnerWoche.getItems().clear();

        // the week selected from the comboBox
        String wochenAuswahl = comboBox_RW_Wochenansicht.getSelectionModel().selectedItemProperty().getValue(); // DD.MM.YYYY-DD.MM.YYYY

        // String split, first date = monday, last date = friday
        String startdatum = wochenAuswahl.substring(0, 10);
        String enddatum = wochenAuswahl.substring(11, 21);


        // db = Database object with method getTasksFromWeek
        try {
            rechnerWochenansichtTabelle.addAll(db.getRechnerAusAuftragsverteilungWoche(startdatum, enddatum));
        } catch (SQLException e) {
            e.printStackTrace();
        }

        for (int i = 0; i < rechnerWochenansichtTabelle.size(); i++) {

            Date d = rechnerWochenansichtTabelle.get(i).getBearbeitungsdatum();
            Integer seriennr = rechnerWochenansichtTabelle.get(i).getSeriennr(); // SERIENNUMER DIE REIN MUSS


            switch(simpleDateformat.format(d)) {

            case "Montag":
            col_RW_Montag.setCellValueFactory(new PropertyValueFactory<>("seriennr"));
                break;
            case "Dienstag":
            col_RW_Dienstag.setCellValueFactory(new PropertyValueFactory<>("seriennr"));
                break;
            case "Mittwoch":                                                                                                                                    
            col_RW_Mittwoch.setCellValueFactory(new PropertyValueFactory<>("seriennr"));
                break;
            case "Donnerstag":
            col_RW_Donnerstag.setCellValueFactory(new PropertyValueFactory<>("seriennr"));
                break;
            case "Freitag":
            col_RW_Freitag.setCellValueFactory(new PropertyValueFactory<>("seriennr"));
                break;
            default:
            break;          
            }

        }
        tableRechnerWoche.setItems(rechnerWochenansichtTabelle);
    });

}

共有1个答案

申辉
2023-03-14

您希望在单行中放置多个auftragsveterilung对象。由于items列表中的每个元素都对应于表的单行,因此您的方法是错误的。您需要将多个auftragsveterilung对象放在一个单独的项目中来访问正确的数据,或者使用自定义的CellValueFactory来检索数据并使用标识周的项目。

此外,我不建议在工作日依赖使用德语的程序,除非您专门设置simpledateformat使用德语作为区域设置。否则,更改默认的区域设置可能会破坏您的程序,我不会指望您的教授/导师在他们用来测试您的程序的机器上使用德语区域设置。

下面的代码假设您不指定fxml文件中的列,而是以编程方式创建它们。在下面的代码中,我使用auftragsveterilung[]存储星期一、星期二、...、星期五的对象。此外,它还使用java.timeAPI:

@Override
public void initialize​(URL location, ResourceBundle resources) {
    final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE", Locale.GERMAN);

    for (int i = 1; i <= lastDay; i++) {
        final int dayIndex = i-1;
        DayOfWeek day = DayOfWeek.of(i);
        TableColumn<Auftragsverteilung[], Integer> column = new TableColumn<>(formatter.format(day));
        column.setCellValueFactory(cd -> {
            Auftragsverteilung auftrag = cd.getValue()[dayIndex];
            return new SimpleObjectProperty<>(auftrag == null ? null : auftrag.getSeriennr());
        });
        tableRechnerWoche.getColumns().add(column);

    }

    tableRechnerWoche.setItems(rechnerWochenansichtTabelle);
    ...
}
@FXML
private TableView<Auftragsverteilung[]> tableRechnerWoche;
@FXML
private TableColumn<Auftragsverteilung[], Integer> col_RW_Montag;
@FXML
private TableColumn<Auftragsverteilung[], Integer> col_RW_Dienstag;
@FXML
private TableColumn<Auftragsverteilung[], Integer> col_RW_Mittwoch;
@FXML
private TableColumn<Auftragsverteilung[], Integer> col_RW_Donnerstag;
@FXML
private TableColumn<Auftragsverteilung[], Integer> col_RW_Freitag;

...

public void wochenansichtFuellen() {

    // ComboBox Listener (ChangeListener)
    comboBox_RW_Wochenansicht.valueProperty().addListener((o, oldValue, newValue) -> {
        rechnerWochenansichtTabelle.clear();

        // String split, first date = monday, last date = friday
        String startdatum = newValue.substring(0, 10);
        String enddatum = newValue.substring(11, 21);

        // db = Database object with method getTasksFromWeek
        try {
            // depending on the return type and order of the elements
            // rechnerWochenansichtTabelle.add(db.getRechnerAusAuftragsverteilungWoche(startdatum, enddatum));
            // may be sufficient instead of the following code

            // store each Auftragsverteilung in array with index corresponding to the day of week of the bearbeitungsdatum
            Auftragsverteilung[] row = new Auftragsverteilung[DayOfWeek.FRIDAY.getValue()];
            for (Auftragsverteilung auftrag : db.getRechnerAusAuftragsverteilungWoche(startdatum, enddatum)) {
                LocalDate date = auftrag.getBearbeitungsdatum().toLocalDate();
                row[date.getDayOfWeek().getValue() - 1] = auftrag;
            }

            rechnerWochenansichtTabelle.add(row);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    });

}
 类似资料:
  • 我很难用ObservableList中获得的数据填充JavaFX中的表视图。 当在病人信息控制器中按下btn确认()时,它会使用病人信息控制器视图中的屏幕文本数据创建一个病人对象。 然后将该对象添加到队列类中的LinkedList队列中。然后返回队列并将其传递给QueueTabPageController方法displayQueue() 我知道,当我将增强的for循环打印到控制台时,患者对象获得了

  • 问题内容: 如果我有一个包含多列的数据框,如何只填充一列?还是一组列? 我只知道如何按轴进行操作。 问题答案: tl; dr: 我还添加了一个自我包含的示例:

  • 我在NetBeans IDE中工作,语言是Java,主要的类是JFrame Form。 我需要从Jtable获取所有数据并用这些数据填充数组。数组代表矩阵。 代码如下 我有一个错误 线程“AWT-EventQueue-0”java.lang.ClassCastException:java.lang.String无法转换为java.lang.Double 所以将表中的元素设置为双精度不是那么容易吗?

  • series(string $value,[ string $categories]) string $value $config = ['path' => './tests']; ​ $fileObject = new \Vtiful\Kernel\Excel($config); ​ $fileObject = $fileObject->fileName('tutorial.xlsx'); $

  • factory 辅助函数 必须 使用 factory 方法来做数据填充,因为是框架提倡的,并且可以同时为测试代码服务。 运行效率 开发数据填充时,必须 特别注意 php artisan db:seed 的运行效率,否则随着项目的代码量越来越大,db:seed 的运行时间会变得越来越长,有些项目多达几分钟甚至几十分钟。 原则是: Keep it lighting speed. 只有当 db:seed

  • 简介 Laravel 可以用 seed 类轻松地为数据库填充测试数据。所有的 seed 类都存放在 database/seeds 目录下。你可以任意为 seed 类命名,但是更应该遵守类似 UsersTableSeeder 的命名规范。Laravel 默认定义的一个 DatabaseSeeder 类。可以在这个类中使用 call 方法来运行其它的 seed 类从而控制数据填充的顺序。 编写 See