Hallo,
ich habe eine extrem große umd komplexe Applikation in der ein Fehler auftaucht den ich einfach nicht zu fassen bekomme. Schreibe ich eine Test-Applikation mit minimalem Code tritt bei gleichem Code der Fehler nicht auf.
Ich versuche das Ganze so gut es geht zu beschreiben aber es ist nicht einfach und MB von Code würden sicher auch nicht helfen.
Ich öffne ein Panel mit einer JTable. Alles soweit standard Zeug. Unter dem ScrollPane in dem die JTable ist ist ein weiteres Panel welches ein Label enthält das den Table Status anzeigt (Also zum beispiel "15 / 200 Jobs" je nach Filtereinstellungen). Links vom den ScrollPane ist ein weiteres Panel welches die Filterelemente für die Tabelle beinhaltet. Also DropDownMenus, Checkmarks und Searchfields etc.
Dem TableModel gebe ich nun das Status Label und den Filter mit damit dieses entsprechend die Anzeige machen kann.
Der eigentliche JobListController öffnet einen Langzeit-Requester mit Cancel Button und lädt die Jobs asynchron ein. Wenn der JobLoader die Jobs geladen hat gibt er dem jobController über seine Listener-Funktionen die geladene Liste.
Der Controller öffnet dann das oben beschriebene Panel und setzt die neu geladene Liste.
Das Model setzt dann die Tabelle
Jetzt kommt der eigentlich Spaß. Wenn ich in der Zeile countLabel.setText() das joblist.size() weglasse oder die joblist leer ist (also die size() == 0) oder wenn ich die ganze Zeile ausdokkumentiere, dann wird das Ganze Panel nicht mehr angezeigt. Es gibt keinen Fehler, keine Exception, das Panel bleibt einfach leer.
Ich benutzte das countLabel nirgendwo anders. Es wird nur im Panel erstellt, "Jobs" vorinitialisiert und hier verändert. Sonst keine Besonderheit.
Und um es jetzt ganz verrückt zu machen
funktioniert.
funktioniert nicht.
Lasse ich das panel.add(countLabel) beim Erstellen des Panels weg geht es auch nicht.
Lösche ich das countLabel und alle seine Verweise geht auch nichts.
Ersetze ich das joblist.size() im setText durch eine Konstante oder irgend eine andere Variable geht es auch nicht.
Fazit:
Es muss dieses Label auf dem Panel sein und es muss ein setText(joblist.size()) darauf gemacht werden. Sonst wird das gesammte Panel (Table, Filter, Status) nicht dargestellt.
Ich habe schon den Namen von countLabel händisch geändert (Also ohne Refactoring) um sicher zu gehen das es nicht doch noch eine anderer Referenz darauf gibt aber ist nicht.
Das ist alles komplett unlogisch ...
Ich habe echt keine Idee was ich noch debuggen soll. Ich kann in das Label schreiben was ich will, solange das joblist.size() drin bleibt.
Gruß
Claus
ich habe eine extrem große umd komplexe Applikation in der ein Fehler auftaucht den ich einfach nicht zu fassen bekomme. Schreibe ich eine Test-Applikation mit minimalem Code tritt bei gleichem Code der Fehler nicht auf.
Ich versuche das Ganze so gut es geht zu beschreiben aber es ist nicht einfach und MB von Code würden sicher auch nicht helfen.
Ich öffne ein Panel mit einer JTable. Alles soweit standard Zeug. Unter dem ScrollPane in dem die JTable ist ist ein weiteres Panel welches ein Label enthält das den Table Status anzeigt (Also zum beispiel "15 / 200 Jobs" je nach Filtereinstellungen). Links vom den ScrollPane ist ein weiteres Panel welches die Filterelemente für die Tabelle beinhaltet. Also DropDownMenus, Checkmarks und Searchfields etc.
Dem TableModel gebe ich nun das Status Label und den Filter mit damit dieses entsprechend die Anzeige machen kann.
Code:
private ArrayList<MultiJob> joblist;
public ArrayList<MultiJob> filterList;
private JLabel countLabel;
public JobListTableModel(JobsFilter jobfilter, JLabel countlabel)
{
filter = jobfilter;
filter.addJobsFilterListener(this);
countLabel = countlabel;
joblist = new ArrayList<>();
filterChanged();
}
Der eigentliche JobListController öffnet einen Langzeit-Requester mit Cancel Button und lädt die Jobs asynchron ein. Wenn der JobLoader die Jobs geladen hat gibt er dem jobController über seine Listener-Funktionen die geladene Liste.
Der Controller öffnet dann das oben beschriebene Panel und setzt die neu geladene Liste.
Code:
@Override
public void jobLoaderDidFinish(ArrayList<MultiJob> list)
{
if(cancelDialog != null)
cancelDialog.close();
cancelDialog = null;
jobList = list;
if(jobListPanel == null)
{
UserSettings.setSettingsValue("SelectedMainPanelButton", "JobList");
jobListPanel = new JobListPanel(filter, getLastUpdate());
jobListPanel.setJobListPanelListener(this);
mainPanel.openJobListPanel(jobListPanel);
}
tableModel.replaceList(jobList);
}
Das Model setzt dann die Tabelle
Code:
public boolean replaceList(ArrayList<MultiJob>list)
{
joblist = list;
filterChanged();
return true;
}
public void filterChanged()
{
filterList = new ArrayList<>();
for(MultiJob entry : joblist)
{
.... hier kommen nur die Abfrage ob die Filter greifen oder eben nicht, das hat aber nichts mit der Sache zu tun
filterList.add(entry);
}
System.out.println(joblist.size());
if(countLabel != null)
countLabel.setText(filterList.size()+" / "+joblist.size()+" "+"Jobs");
fireTableDataChanged();
}
Jetzt kommt der eigentlich Spaß. Wenn ich in der Zeile countLabel.setText() das joblist.size() weglasse oder die joblist leer ist (also die size() == 0) oder wenn ich die ganze Zeile ausdokkumentiere, dann wird das Ganze Panel nicht mehr angezeigt. Es gibt keinen Fehler, keine Exception, das Panel bleibt einfach leer.
Ich benutzte das countLabel nirgendwo anders. Es wird nur im Panel erstellt, "Jobs" vorinitialisiert und hier verändert. Sonst keine Besonderheit.
Und um es jetzt ganz verrückt zu machen
Code:
int g = joblist.size();
if(countLabel != null)
countLabel.setText(filterList.size()+" / "+g" "+"Jobs");
funktioniert.
Code:
int g = joblist.size();
//if(countLabel != null)
// countLabel.setText(filterList.size()+" / "+g" "+"Jobs");
funktioniert nicht.
Lasse ich das panel.add(countLabel) beim Erstellen des Panels weg geht es auch nicht.
Lösche ich das countLabel und alle seine Verweise geht auch nichts.
Ersetze ich das joblist.size() im setText durch eine Konstante oder irgend eine andere Variable geht es auch nicht.
Fazit:
Es muss dieses Label auf dem Panel sein und es muss ein setText(joblist.size()) darauf gemacht werden. Sonst wird das gesammte Panel (Table, Filter, Status) nicht dargestellt.
Ich habe schon den Namen von countLabel händisch geändert (Also ohne Refactoring) um sicher zu gehen das es nicht doch noch eine anderer Referenz darauf gibt aber ist nicht.
Das ist alles komplett unlogisch ...
Ich habe echt keine Idee was ich noch debuggen soll. Ich kann in das Label schreiben was ich will, solange das joblist.size() drin bleibt.
Gruß
Claus