用 JSON 中的一些数据填充 Tableview

Filling a Tableview with some data from JSON

我在 JavaFX 中有一个 TableView,我想填充一些 JSON 数据。

我从服务器收到的JSON是这样的:

{"mirelradoi":10,"test":6, "bob":3}

但是我很难理解如何使用这个 TableView。 我已经在 SceneBuilder 中创建了 TableView(及其相应的列),所以在我的代码中我不再初始化它。 (我不认为我仍然需要它 - 我可能是错的,我是一个完全的初学者:))

这是我在 table 视图中添加 JSON 的方式:

            tabelClasament.setItems(FXCollections.observableArrayList(receivedJSON.get("clasament")));

其中 tableClasament 是我正在谈论的 TableView,receivedJSON.get("clasament") 为我提供了上面显示的数据。

但出于某种原因,我得到了这个:

所以我没有得到“table 中没有内容”,就像没有数据一样,但它也没有显示。

如何将 JSON 导入到 table 中?在我的代码中,关于 table 的唯一内容是该行和 tableClasament as TableView 的定义。

谢谢。

TableView 添加数据时,您还必须指定 如何 每列应显示给定数据(即:TableView 不会神奇地知道哪个列对应于 JSON 数据中的每个字段或 属性。

建议创建数据模型 class 来表示 JSON 中的数据,然后加载 JSON 并填充新数据模型的列表 class.

这是一个简短的示例,说明如何使用来自任何来源的数据填充您的 TableView(通过使用 ClasamentDisp class,它保存来自您的 JSON 来源)。

import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class JsonToTableView extends Application {

    public static void main(String[] args) {

        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // **********************************************************************************************
        // Create a basic layout
        // **********************************************************************************************
        VBox root = new VBox(5);
        root.setAlignment(Pos.TOP_CENTER);
        root.setPadding(new Insets(10));

        // **********************************************************************************************
        // Create the TableView
        // **********************************************************************************************
        final TableView<ClasamentDisp> tableView = new TableView<>();

        // **********************************************************************************************
        // Create the columns for the TableView (TableColumn cannot handle Integer for some reason, so we
        // set the data type to Number for the Score column)
        // **********************************************************************************************
        final TableColumn<ClasamentDisp, String> colParticipant = new TableColumn<>("Participant");
        final TableColumn<ClasamentDisp, Number> colScore = new TableColumn<>("Score");

        // **********************************************************************************************
        // Add the columns to the TableView (skip if defined in FXML)
        // **********************************************************************************************
        tableView.getColumns().addAll(colParticipant, colScore);

        // **********************************************************************************************
        // In order for the columns to display the properties in our ClasamentDisp objects, we need to
        // define the CellPropertyFactory for each column
        // **********************************************************************************************
        colParticipant.setCellValueFactory(c -> c.getValue().participantPropertyProperty());
        colScore.setCellValueFactory(c -> c.getValue().scorePropertyProperty());

        // **********************************************************************************************
        // Create a list to hold our Clasaments, as loaded from data source (ie: JSON)
        // **********************************************************************************************
        ObservableList<ClasamentDisp> clasaments = FXCollections.observableArrayList();
        clasaments.addAll(new ClasamentDisp("mirelradoi", 10),
                          new ClasamentDisp("test", 6),
                          new ClasamentDisp("bob", 3));

        // **********************************************************************************************
        // Set the items of the TableView to our list of loaded data
        // **********************************************************************************************
        tableView.setItems(clasaments);

        // **********************************************************************************************
        // Finally, here we add the TableView to the Scene (can be skipped if injected via FXML)
        // **********************************************************************************************
        root.getChildren().add(tableView);

        // **********************************************************************************************
        // Set the Scene for the stage
        // **********************************************************************************************
        primaryStage.setScene(new Scene(root));

        // **********************************************************************************************
        // Configure the Stage
        // **********************************************************************************************
        primaryStage.setTitle("Test Application");
        primaryStage.show();
    }
}

class ClasamentDisp {

    // **********************************************************************************************
    // Create Properties to hold the values of each item
    // **********************************************************************************************
    private final StringProperty participantProperty = new SimpleStringProperty();
    private final IntegerProperty scoreProperty = new SimpleIntegerProperty();

    public ClasamentDisp(String participant, int score) {

        this.participantProperty.setValue(participant);
        this.scoreProperty.setValue(score);
    }

    public String getParticipantProperty() {

        return participantProperty.get();
    }

    public void setParticipantProperty(String participantProperty) {

        this.participantProperty.set(participantProperty);
    }

    public StringProperty participantPropertyProperty() {

        return participantProperty;
    }

    public int getScoreProperty() {

        return scoreProperty.get();
    }

    public void setScoreProperty(int scoreProperty) {

        this.scoreProperty.set(scoreProperty);
    }

    public IntegerProperty scorePropertyProperty() {

        return scoreProperty;
    }
}