Reputation:
I am having a problem with JPanel repaint after update. So, I have a function which adds a few (user selection) JTable to JPanel. On first use, everything is ok, all components are ok. But when I run a second time the same function, all components disappear. And I do not understand why. When I check list of components in JPanel that is ok but I do not see not even one.
private void refreshTables(){
tablePanel.removeAll();
List resultListUzytkownicy=null;
try {
resultListUzytkownicy = DAO.GlobalDOA.getQuery("from Uzytkownik u where u.widokWPlanownaiu=1");}
catch (IOException ex) {Logger.getLogger(PlanowanieFrame.class.getName()).log(Level.SEVERE, null, ex);}
int tabelaNr = 0;
Vector<String> tableHeaders = new Vector<String>();
tableHeaders.add("ID:");
tableHeaders.add("Kategoria:");
tableHeaders.add("Podkategoria:");
tableHeaders.add("Data przyjęcia:");
tableHeaders.add("Przyjmujący:");
tableHeaders.add("Serwisujący:");
tableHeaders.add("Data zamknięcia:");
tableHeaders.add("Zamykający:");
tableHeaders.add("Klient:");
tableHeaders.add("Status:");
tableHeaders.add("Opis:");
tableHeaders.add("Termin:");
tableHeaders.add("Priorytet:");
tableHeaders.add("Podzlecenia:");
for(Object o : resultListUzytkownicy){
Uzytkownik user = (Uzytkownik)o;
List resultList = null;
try {
resultList = DAO.GlobalDOA.getQuery("from Zlecenie z where z.podzlecenie=0 and z.serwisujacy="+user.getId()+" order by id desc");}
catch (IOException ex) {Logger.getLogger(PlanowanieFrame.class.getName()).log(Level.SEVERE, null, ex);}
Vector tableData = new Vector();
for(Object b : resultList) {
Zlecenie actor = (Zlecenie)b;
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(actor.getId());
if(actor.getKategoria()!=null){oneRow.add(actor.getKategoria().getTemat());}
else{oneRow.add(null);};
if(actor.getPodkategoria()!=null){oneRow.add(actor.getPodkategoria().getTemat());}
else{oneRow.add(null);};
oneRow.add(DateRender.longDate(actor.getDataPrzyjecia()));
oneRow.add(actor.getPrzyjmujacy().getImie()+" "+actor.getPrzyjmujacy().getNazwisko());
if(actor.getSerwisujacy()!=null){oneRow.add(actor.getSerwisujacy().getImie()+" "+actor.getSerwisujacy().getNazwisko());}
else{oneRow.add(null);};
if(actor.getDataZamkniecia()!=null){oneRow.add(DateRender.longDate(actor.getDataZamkniecia()));}
else{oneRow.add(null);};
if(actor.getZamykajacy()!=null){oneRow.add(actor.getZamykajacy().getImie()+" "+actor.getZamykajacy().getNazwisko());}
else{oneRow.add(null);};
if(actor.getKlient()!=null){oneRow.add(actor.getKlient().getNazwa());}
else{oneRow.add(null);};
oneRow.add(DAO.StatusDAO.getStatusById(actor.getStatus()).getOpis());
oneRow.add(actor.getOpis());
oneRow.add(actor.getTermin());
oneRow.add(actor.getPriorytet());
oneRow.add(actor.getPodzlecenia());
tableData.add(oneRow);
}
ZleceniaModel model = new ZleceniaModel(tableHeaders,tableData);
JTable table = new JTable(model);
JScrollPane scrollPane = new JScrollPane(table);
tableResizer(tablePanel, scrollPane, tabelaNr);
tablePanel.add(scrollPane);
tablePanel.revalidate();
tablePanel.repaint();
System.out.println(tablePanel.getComponents());
tabelaNr++;
}
}
public static void tableResizer(JPanel panel, JScrollPane scrollPane, int tableaNr){
ComponentListener componentListener = new ComponentListener (){
@Override
public void componentResized(ComponentEvent e) {
int panelWidth = panel.getWidth();
scrollPane.setPreferredSize(new Dimension(panelWidth, 100));
scrollPane.setBounds(0, tableaNr*100, panelWidth, 100);
}
@Override
public void componentMoved(ComponentEvent e) {}
@Override
public void componentShown(ComponentEvent e) { }
@Override
public void componentHidden(ComponentEvent e) { }
};
panel.addComponentListener(componentListener);
}
Upvotes: 1
Views: 59
Reputation: 324108
Don't remove the components from the panel.
All you need to do is replace the TableModel of the table and the table will update itself.
So when you create the frame create the table and scroll pane in the constructor and add the scroll pane to the frame.
JTable table = new JTable();
JScrollPane = new JScrollPane(table);
panel.add( scrollPane );
Then in your refresh logic the code just becomes:
ZleceniaModel model = new ZleceniaModel(tableHeaders,tableData);
table.setModel( model );
//JTable table = new JTable(model);
//JScrollPane scrollPane = new JScrollPane(table);
//tableResizer(tablePanel, scrollPane, tabelaNr);
//tablePanel.add(scrollPane);
//tablePanel.revalidate();
//tablePanel.repaint();
Upvotes: 1