JavaFX: заполнить столбец TableView конкретными данными из ObservableList - PullRequest
0 голосов
/ 12 июня 2019

Я работаю над проектом для университета.Я только что изучил Java и JavaFX.

У меня проблема, может быть, кто-то может мне помочь.

С этим небольшим программным обеспечением вы можете планировать задачи на неделю.В табличном представлении у вас есть столбцы с понедельника по пятницу.

У меня есть база данных, где я могу получить объекты «Auftragsverteilung» (это означает задачи, которые запланированы на определенную дату).Эти объекты имеют серийный номер (= seriennr) и дату (= bearbeitungsdatum).

Чтобы заполнить неделю в виде таблицы, я получаю из базы данных все задачи, запланированные на неделю.Задачи на неделю сохраняются в ObchnableList rechnerWochenansichtTabelle.Вы можете выбрать неделю из выпадающего списка.Вот почему у меня есть слушатель в выпадающем списке.

Теперь я просматриваю ObservableList и проверяю, является ли дата понедельником, четвергом и т. Д. Так что это работает.Но если я напишу col_RW_Montag.setCellValueFactory (new PropertyValueFactory <> ("seriennr")), столбец получит все серийные номера, сохраненные в observableList, но мне нужен конкретный серийный номер с этой конкретной даты.

Как я могуполучить конкретный серийный номер из даты и заполнить его столбцом?

Я надеюсь, вы понимаете все, потому что проект на немецком языке.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация илибольше кода.

Спасибо.

Класс "Auftragsverteilung" (модель)

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;
    }

}

Класс "AuftragsansichtController" (контроллер)

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);
    });

}

Ответы [ 2 ]

1 голос
/ 12 июня 2019

Вы хотите разместить несколько Auftragsverteilung объектов в одной строке. Поскольку каждый элемент в списке items соответствует одной строке таблицы, ваш подход неверен. Вам необходимо хранить несколько объектов Auftragsverteilung в одном элементе для правильного доступа к данным или использовать пользовательские cellValueFactory s для извлечения данных и использования элементов, идентифицирующих неделю.

Кроме того, я не рекомендую полагаться на программу с использованием немецких дней недели, если вы специально не настроили simpleDateformat для использования немецкого языка в качестве локали. В противном случае изменение локали по умолчанию может нарушить вашу программу, и я бы не стал рассчитывать на то, что ваш преподаватель / преподаватель будет использовать немецкую локализацию на машине, которую они используют для тестирования вашей программы.

В следующем коде предполагается, что вы не указываете столбцы в файле fxml, а создаете их программно. В следующем коде я использую Auftragsverteilung[] для хранения объектов на понедельник, вторник, ..., пятницу. Кроме того, он использует java.time API:

@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();
        }
    });

}
0 голосов
/ 12 июня 2019

Вы не используете ObservableList, так как его следует использовать. Проверьте документацию для ObservableList. ObservableList использует шаблон Observer. Есть Наблюдатели и Наблюдаемые. У вас есть список наблюдаемых, ваш контроллер может наблюдать за ними. https://en.wikipedia.org/wiki/Observer_pattern

Не глядя на ваш код, вам нужно что-то похожее на это (фрагмент ниже скопирован с https://dzone.com/articles/javafx-collections-observablelist-and-observablema):

observableList.addListener(new ListChangeListener() {
    @Override
    public void onChanged(ListChangeListener.Change change) {    
        System.out.println("Detected a change! ");
        while (change.next()) {
            System.out.println("Was added? " + change.wasAdded());
            System.out.println("Was removed? " + change.wasRemoved());
        }
    }
}

По сути, слушатель будет наблюдать ваши наблюдаемые и сообщать вам через этот переопределенный метод, что изменилось и как оно изменилось. Там вам нужно принять меры, т.е. изменить значение в таблице.

Надеюсь, это поможет.

...