第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何將具有可變大小的嵌套對象數(shù)組設(shè)置為 javafx TableView

如何將具有可變大小的嵌套對象數(shù)組設(shè)置為 javafx TableView

湖上湖 2022-06-04 11:05:15
我有一個 ClassTestEvaluation 類型的對象。它擁有一個 Task 類型的 ArrayList。這個數(shù)組可以有任意數(shù)量的任務(wù)并且是不可預(yù)測的。我想設(shè)置一個表格視圖,它將在列中顯示給定的任務(wù),以便用戶可以輸入分數(shù)。我的問題是我不知道如何將一個可變長度的數(shù)組設(shè)置為另一個對象的一部分作為我的表格視圖的源。我無法使用簡單的成員 task1、task2 等構(gòu)建像 ClassTestEvaluationItem 這樣的包裝器,因為任務(wù)的數(shù)量不固定。因此,我的問題是我必須做什么才能正確設(shè)置任務(wù)列的 propertyValueFactories?我遵循了很多教程,比如這里的教程:https ://docs.oracle.com/javafx/2/ui_controls/table-view.htm 。一般來說,跟隨并讓他們工作是沒有問題的。但它們只處理簡單(平面)數(shù)據(jù)。TableView<ClassTestEvaluation> table = new TableView<>();TableColumn colFirstName = new TableColumn("Vorname");colFirstName.setCellValueFactory(new PropertyValueFactory<ClassTestEvaluation, String>("firstName");TableColumn colLastName = new TableColumn("Nachname");colLastName.setCellValueFactory(new PropertyValueFactory<ClassTestEvaluation, String>("lastName");table.getColumns().addAll(colFirstName, colLastName);ArrayList<Task> tasks = classTestEvaluation.getTasks();for(Task t : tasks) {    TableColumn colTask = new TableColumn(t.getTitle());    table.getColumns().add(colTask);}如您所見,為 colFirstName 和 colLastName 設(shè)置 PropertyValueFactory 并不難。但是對于長度可變并存儲在本身是 ClassTestEvaluation 對象的一部分的數(shù)組中的任務(wù),我該怎么做呢?根據(jù) classtest 的任務(wù)數(shù)量,我希望我的表格視圖看起來像這樣:名字 | 姓氏 | 任務(wù) 1 | 任務(wù) 2 | ...我希望有人可以在這里幫助我,因為我不明白。非常感謝!
查看完整描述

1 回答

?
慕妹3242003

TA貢獻1824條經(jīng)驗 獲得超6個贊

好吧,我實際上找到了自己問題的解決方案,并認為這可能會引起其他人的興趣。回想一下:我的問題是我不知道如何從可變長度的數(shù)組中構(gòu)建列,該數(shù)組是另一個項目(組合)的一部分。


我需要了解的是 cellValueFactory、cellFactory 和 onEditCommit 如何分別與回調(diào)或 lambda 一起使用以獲得所需的結(jié)果。這花了我相當長的時間。


這是我為得到它所做的:


    private void createTableColumnsForTasks(ClassTestEvaluation cte) {

    int resultCounter = 1;


    // For each given task in ClassTestEvaluation...

    for (Task t : cte.getTasks()) {


        // ...create a column for the corresponding points reached (0 in the beginning).

        TableColumn<ClassTestEvaluationRow, Double> colResult = new TableColumn<>("A" + resultCounter + " (" + t.getPoints() + ")");

        resultCounter++;


        // Make the column editable.

        colResult.setEditable(true);



        // Define how the values in the task columns will be set.

        colResult.setCellValueFactory((TableColumn.CellDataFeatures<ClassTestEvaluationRow, Double> row) -> {


            ClassTestEvaluationRow cter = row.getValue();


            for(Result r : cter.getResults()) {

                if(r.getIdTask() == t.getId()) {

                    ObservableValue<Double> obsResult = new SimpleObjectProperty<Double>(r.getPoints());

                    return obsResult;               

                }

            }


            return null;


        });




        // Create combo box to choose points from for each given task and result.

        createTableColumnComboBoxForResultEditing(colResult, t);



        // Create method to store edited data in selected ClassTestEvaluationRow.

        createOnEditCommitMethods(colResult, t);


        ((EvaluatorUI) this.getView()).getTableView().getColumns().add(colResult);


    }


}




private void createTableColumnComboBoxForResultEditing(TableColumn<ClassTestEvaluationRow, Double> colResult, Task t) {

    ArrayList<Double> cbPoints = new ArrayList<>();


    for(double i = 0.0; i <= t.getPoints(); i = i+0.5) {

        cbPoints.add(i);

    }


    ObservableList<Double> obsPoints = FXCollections.observableArrayList(cbPoints);


    colResult.setCellFactory(ComboBoxTableCell.<ClassTestEvaluationRow, Double>forTableColumn(obsPoints));      

}





private void createOnEditCommitMethods(TableColumn<ClassTestEvaluationRow, Double> colResult, Task t) {


    colResult.setOnEditCommit((CellEditEvent<ClassTestEvaluationRow, Double> event) -> {

        TablePosition<ClassTestEvaluationRow, Double> pos = event.getTablePosition();

        Double newValue = event.getNewValue();

        int row = pos.getRow();

        ClassTestEvaluationRow cter = (ClassTestEvaluationRow) event.getTableView().getItems().get(row);


        for(Result result : cter.getResults()) {

            if(result.getIdTask() == t.getId()){

                result.setPoints(newValue);

                classTestEvaluationsService.updateResult(cter.getClassTestEvaluation(), result);

            }

        }


    });


}

我希望這對你們中的一些人有所幫助。問候。


查看完整回答
反對 回復(fù) 2022-06-04
  • 1 回答
  • 0 關(guān)注
  • 101 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號