用 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;
}
}
我在 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;
}
}