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