I am struggling to put some firebase data into a jtable in java swing. As seen in photo I’ve been able to retrieve the data from firebase but for some reason the data won’t be displayed in the JTable field(table1) I looks like the getID(), getName()… methods didn’t get any value, since I tried to print row[i] to see if there is any value.
There is a screenshot of the actual program
Could any of you tell what’s the problem?
addNewCaseButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { database = FirebaseDatabase.getInstance(); ref = database.getReference("NewCases"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { System.out.println(dataSnapshot.getValue()); ArrayList<Object[]> myList = new ArrayList<>(); DefaultTableModel tableModel = (DefaultTableModel) table1.getModel(); tableModel.addColumn("ID"); tableModel.addColumn("Name"); tableModel.addColumn("Age"); tableModel.addColumn("City"); tableModel.addColumn("TimeStamp"); tableModel.addColumn("Disease"); tableModel.addColumn("Risk"); Object[] row = new Object[6]; tableModel.setNumRows(0); myList.clear(); CasesList casesList = new CasesList(); for (DataSnapshot ds : dataSnapshot.getChildren()){ casesList.setID((Integer)ds.child("ID").getValue()); casesList.setName(ds.child("Name").getValue().toString()); casesList.setAge((Integer)ds.child("Age").getValue()); casesList.setCity(ds.child("City").getValue().toString()); casesList.setTimeStamp(ds.child("TimeStamp").getValue().toString()); casesList.setDisease(ds.child("Disease").getValue().toString()); casesList.setRisk(ds.child("Risk").getValue().toString()); // myList.add(ds.getKey()); row[0] = casesList.getID(); row[1] = casesList.getName(); row[2] = casesList.getAge(); row[3] = casesList.getCity(); row[4] = casesList.getTimeStamp(); row[5] = casesList.getDisease(); row[6] = casesList.getRisk(); myList.add(row); System.out.println(myList); tableModel.addRow(row); } table1.setModel(tableModel);
Thanks in advance!
Advertisement
Answer
Have you defined the table columns with lines like these?
DefaultTableModel tableModel = new DefaultTableModel(); tableModel.addColumn("ID"); tableModel.addColumn("Name"); tableModel.addColumn("Age");
Also, the method setModel
should be called after the for:
for... { //add row to tableModel } table1.setModel(tableModel);
EDIT:
Analyzing in more detail, I also verify that you have 7 fields but your array has only space for 6. In this line row [6] = casesList.getRisk ();
throws an exception at runtime. Expand the size of your array to solve this.
Object[] row = new Object[7];
To display the column names it is convenient to add your table to a scroll panel.
JScrollPane scrollPane = new JScrollPane(table1); frame.getContentPane().add(scrollPane);
This works for me:
ArrayList<Object[]> myList = new ArrayList<>(); DefaultTableModel tableModel = (DefaultTableModel) table1.getModel(); tableModel.addColumn("ID"); tableModel.addColumn("Name"); tableModel.addColumn("Age"); tableModel.addColumn("City"); tableModel.addColumn("TimeStamp"); tableModel.addColumn("Disease"); tableModel.addColumn("Risk"); Object[] row = new Object[7]; tableModel.setNumRows(0); myList.clear(); for (DataSnapshot ds : dataSnapshot.getChildren()) { CasesList casesList = new CasesList(); casesList.setID((Integer) ds.child("ID").getValue()); casesList.setName(ds.child("Name").getValue().toString()); casesList.setAge((Integer) ds.child("Age").getValue()); casesList.setCity(ds.child("City").getValue().toString()); casesList.setTimeStamp(ds.child("TimeStamp").getValue().toString()); casesList.setDisease(ds.child("Disease").getValue().toString()); casesList.setRisk(ds.child("Risk").getValue().toString()); row[0] = casesList.getID(); row[1] = casesList.getName(); row[2] = casesList.getAge(); row[3] = casesList.getCity(); row[4] = casesList.getTimeStamp(); row[5] = casesList.getDisease(); row[6] = casesList.getRisk(); myList.add(row); System.out.println(myList); tableModel.addRow(row); } table1.setModel(tableModel);