JavaFX:TableView数据未显示

JavaFX:TableView数据未显示,java,javafx,Java,Javafx,我正在进行一个项目,需要向tableview添加一些数据,但当我尝试调用addToTable时,它不会显示任何数据。我已经尝试刷新表,当我尝试在初始化方法中硬编码时,它会在启动应用程序时显示。 -编辑:我添加了创建tableview的Fxml文件 package nl.delphinity.controller; import java.net.URL; import java.util.ResourceBundle; import javafx.collections.FXCollecti

我正在进行一个项目,需要向tableview添加一些数据,但当我尝试调用addToTable时,它不会显示任何数据。我已经尝试刷新表,当我尝试在初始化方法中硬编码时,它会在启动应用程序时显示。 -编辑:我添加了创建tableview的Fxml文件

package nl.delphinity.controller;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import nl.delphinity.model.QuestionTable;

public class TeacherController implements Initializable {
    @FXML
    public TableView<QuestionTable> tableView;
    @FXML
    public TableColumn<QuestionTable, String> nameColumn;
    @FXML
    public TableColumn<QuestionTable, String> subjectColumn;
    @FXML
    public TableColumn<QuestionTable, String> timeColumn;
    public Button finishQuestion;

    @Override
    public void initialize(URL location, ResourceBundle resources) {        
        nameColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("name"));
        subjectColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("subject"));
        timeColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("time"));
    }

    @FXML
    private void answerQuestion() {
        QuestionTable selectedItem = tableView.getSelectionModel().getSelectedItem();
        tableView.getItems().remove(selectedItem);
    }

    @FXML
    public void addToTable(String name, String subject, String time) {      
        QuestionTable test = new QuestionTable(name, subject, time);
        tableView.getItems().add(test);


    }
}
包nl.delphinity.controller;
导入java.net.URL;
导入java.util.ResourceBundle;
导入javafx.collections.FXCollections;
导入javafx.collections.ObservableList;
导入javafx.fxml.fxml;
导入javafx.fxml.Initializable;
导入javafx.scene.control.Button;
导入javafx.scene.control.TableColumn;
导入javafx.scene.control.TableView;
导入javafx.scene.control.cell.PropertyValueFactory;
导入nl.delphinity.model.QuestionTable;
公共类TeacherController实现可初始化{
@FXML
公共桌面视图桌面视图;
@FXML
公共表列名称列;
@FXML
公共表列主题列;
@FXML
公共表列时间列;
公共按钮完成问题;
@凌驾
公共void初始化(URL位置,ResourceBundle资源){
nameColumn.setCellValueFactory(新属性ValueFactory(“名称”);
subjectColumn.setCellValueFactory(新属性ValueFactory(“主题”);
timeColumn.setCellValueFactory(新属性ValueFactory(“时间”);
}
@FXML
私人无效回答问题(){
问题表selectedItem=tableView.getSelectionModel().getSelectedItem();
tableView.getItems().remove(selectedItem);
}
@FXML
public void addToTable(字符串名称、字符串主题、字符串时间){
问题表测试=新问题表(名称、主题、时间);
tableView.getItems().add(测试);
}
}

public void QuestionListener(字符串主题){
应用数据库集合(主题)
.whereEqualTo(“主体”,主体)
.addSnapshotListener(新的EventListener(){
@凌驾
public void onEvent(@Nullable QuerySnapshot快照,
@可为空的FireStore异常(e){
如果(e!=null){
System.err.println(“侦听失败:+e”);
返回;
}
对于(DocumentChange dc:snapshots.getDocumentChanges()){
开关(dc.getType()){
案件补充:
System.out.println(“新:+dc.getDocument().getData());
教师控制器教师控制器=新教师控制器();
teacherController.addToTable(dc.getDocument().getString(“名称”)、dc.getDocument().getString(“主题”)、dc.getDocument().getString(“时间”);
打破
案例修改:
System.out.println(“修改:+dc.getDocument().getData());
打破
已删除的案例:
System.out.println(“删除:+dc.getDocument().getData());
打破
违约:
打破
}
}
}
});
}
```

您需要将可观察列表附加到tableview,代码应该如下所示

public class TeacherController implements Initializable {
@FXML
public TableView<QuestionTable> tableView;
@FXML
public TableColumn<QuestionTable, String> nameColumn;
@FXML
public TableColumn<QuestionTable, String> subjectColumn;
@FXML
public TableColumn<QuestionTable, String> timeColumn;
public Button finishQuestion;
private Observablelist<QuestionTable> data = FXCollection.observableArrayList();

@Override
public void initialize(URL location, ResourceBundle resources) {        
    nameColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("name"));
    subjectColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("subject"));
    timeColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("time"));
tableview.setItem(data);//Add Observable list object here....
}


@FXML
private void answerQuestion() {
    QuestionTable selectedItem = tableView.getSelectionModel().getSelectedItem();
    tableView.getItems().remove(selectedItem);
}

@FXML
public void addToTable(String name, String subject, String time) {      
    QuestionTable test = new QuestionTable(name, subject, time);
    tableView.getItems().add(test);


}

根据您发布的代码,您应该在
tableView
上获得
NullPointerException
。您是否在FXML中定义您的
TableView
?如何初始化它?这将有助于回答您的问题,并包括一个。您需要使用
@FXML
:@FXML private TableView TableView对
表视图
(和列)的定义进行注释`实际上,您在哪里调用
addToTable()
方法?正如我所说的,为了让我们帮助你,你真的需要包含一个。请停止只添加你的代码的一部分。阅读我发布的链接并相应地更新你的问题。也就是说,你正在你的
问题监听器中创建一个新的
教师控制器
。您正在添加到该TableView,而不是您已经显示的TableView。这不仅不正确,而且无法解决OP的问题
tableView.getItems()
返回一个
observeList
,因此调用
add()
就可以了;不需要单独的
可观察列表。OP正在实例化一个新的控制器,并更新该
TableView
,而不是
FXML
中定义的控制器。不,您可能没有。
    public void QuestionListener(String subject) {
        App.db.collection(subject)
        .whereEqualTo("subject", subject)
        .addSnapshotListener(new EventListener<QuerySnapshot>() {
          @Override
          public void onEvent(@Nullable QuerySnapshot snapshots,
                              @Nullable FirestoreException e) {
            if (e != null) {
              System.err.println("Listen failed: " + e);
              return;
            }

            for (DocumentChange dc : snapshots.getDocumentChanges()) {
              switch (dc.getType()) {
                case ADDED:
                  System.out.println("New: " + dc.getDocument().getData());
                  TeacherController teacherController = new TeacherController();
                  teacherController.addToTable(dc.getDocument().getString("name"), dc.getDocument().getString("subject"), dc.getDocument().getString("time"));
                  break;
                case MODIFIED:
                  System.out.println("Modified: " + dc.getDocument().getData());
                  break;
                case REMOVED:
                  System.out.println("Removed: " + dc.getDocument().getData());
                  break;
                default:
                  break;
              }
            }
          }
        });
    }
    ```
public class TeacherController implements Initializable {
@FXML
public TableView<QuestionTable> tableView;
@FXML
public TableColumn<QuestionTable, String> nameColumn;
@FXML
public TableColumn<QuestionTable, String> subjectColumn;
@FXML
public TableColumn<QuestionTable, String> timeColumn;
public Button finishQuestion;
private Observablelist<QuestionTable> data = FXCollection.observableArrayList();

@Override
public void initialize(URL location, ResourceBundle resources) {        
    nameColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("name"));
    subjectColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("subject"));
    timeColumn.setCellValueFactory(new PropertyValueFactory<QuestionTable, String>("time"));
tableview.setItem(data);//Add Observable list object here....
}


@FXML
private void answerQuestion() {
    QuestionTable selectedItem = tableView.getSelectionModel().getSelectedItem();
    tableView.getItems().remove(selectedItem);
}

@FXML
public void addToTable(String name, String subject, String time) {      
    QuestionTable test = new QuestionTable(name, subject, time);
    tableView.getItems().add(test);


}
data.remove(tableView.getSelectionModel().getSelectedIndex());
data.add(QuestionTable q);