Die Lösung des Problems befindet sich im dritten Post!
Hallo zusammen,
ich sitze jetzt schon seit ein paar Stunden daran, mein TableModel dazu zu bewegen mir die Reihen, die ich zur Laufzeit hinzugefügt habe auch an zu zeigen. Bisher leider ohne Erfolg.
Die Daten als solches werden zwar in die Tabelle eingetragen, allerdings kann ich diese nicht sehen. Wenn ich jetzt z.B. zwei Reihen im Konstruktor meines Hauptprogramms zu der JTable hinzufüge, dann sehe ich diese nach dem start auch wunderbar. Sobald ich es allerdings zur Laufzeit versuche klappt es nicht mehr, sie werden dann nicht angezeigt. Das die Reihen, die ich zur Laufzeit hinzugefügt habe da sind habe ich überprüft, indem ich auf meine JTable geklickt habe und dann mit der Pfeil-nach-unten-Taste nach unten gegangen bin und die Selektion dann unter meiner JTable im Nichts verschwunden ist. Wenn ich das mache, ohne zur Laufzeit eine Reihe hinzugefügt zu haben, dann bleibt meine Selektion bei der zweiten Reihe stehen und ich sehe sie noch.
Ich habe mir hier in dem Forum schon mehrere Beiträge, sowie das Tutorial zum Thema JTable durchgelesen, konnte aber auch da nichts finden, was mir weiterhilft.
Mein TableModel leite ich von vom AbstractTableModel ab welches sich (laut Informationen die ich hier gefunden habe) selber darum kümmert, dass die JTable aktualisiert wird, sobald sich dort was getan hat. Da dies allerdings nicht der Fall zu sein scheint, habe ich auch mal die passenden fire-Methoden aufgerufen, nachdem ich etwas an der JTable gemacht habe, allerdings blieb auch das ohne Erfolg.
Hier jetzt mal der Code, ich bin sicher ihr könnt mir damit weiterhelfen:
Mein TableModel
[HIGHLIGHT="Java"]class DownloadTableModel extends AbstractTableModel
{
private static final long serialVersionUID = 1L;
String[] headers = {"ContentId", "Filename", "Size", "Progress"};
@SuppressWarnings("unchecked")
Class[] columnClasses = {String.class, String.class, String.class, JProgressBar.class};
Vector<RowEntry> data = new Vector<RowEntry> ();
@Override
public int getColumnCount()
{
return headers.length;
}
@Override
public int getRowCount()
{
return data.size();
}
@SuppressWarnings("unchecked")
public Class getColumnClass(int c)
{
return columnClasses[c];
}
public String getColumnName(int c)
{
return headers[c];
}
public boolean isCellEditable(int r, int c)
{
return false;
}
@Override
public Object getValueAt(int r, int c)
{
RowEntry e = data.get(r);
switch (c)
{
case 0: return e.getContentId();
case 1: return e.getFilename();
case 2: return e.getSize();
case 3: return e.getProgressBar().getValue();
default: return null;
}
}
public void setValueAt(Object value, int r, int c)
{
}
public void addRow(String filename, String size)
{
int ID = getRowCount();
data.add(new RowEntry(String.valueOf(ID), filename, size, createProgressBar()));
fireTableRowsInserted(ID, ID); // Hier sage ich nochmal explizit, was ich hinzugefügt habe
}
public void removeRowAt(int r)
{
}
private JProgressBar createProgressBar()
{
JProgressBar pb = new JProgressBar(0, 100);
pb.setValue(0);
pb.setStringPainted(true);
return pb;
}
}[/HIGHLIGHT]
Mein TableCellRenderer:
[HIGHLIGHT="Java"]class DownloadTableRenderer extends JProgressBar implements TableCellRenderer
{
private static final long serialVersionUID = 1L;
public DownloadTableRenderer()
{
super(SwingConstants.HORIZONTAL);
this.setSize(115, 15);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
if (value == null)
return this;
if (value instanceof JProgressBar)
setValue(((JProgressBar)value).getValue());
else
setValue(0);
return this;
}
}[/HIGHLIGHT]
Mfg. Patric
Hallo zusammen,
ich sitze jetzt schon seit ein paar Stunden daran, mein TableModel dazu zu bewegen mir die Reihen, die ich zur Laufzeit hinzugefügt habe auch an zu zeigen. Bisher leider ohne Erfolg.
Die Daten als solches werden zwar in die Tabelle eingetragen, allerdings kann ich diese nicht sehen. Wenn ich jetzt z.B. zwei Reihen im Konstruktor meines Hauptprogramms zu der JTable hinzufüge, dann sehe ich diese nach dem start auch wunderbar. Sobald ich es allerdings zur Laufzeit versuche klappt es nicht mehr, sie werden dann nicht angezeigt. Das die Reihen, die ich zur Laufzeit hinzugefügt habe da sind habe ich überprüft, indem ich auf meine JTable geklickt habe und dann mit der Pfeil-nach-unten-Taste nach unten gegangen bin und die Selektion dann unter meiner JTable im Nichts verschwunden ist. Wenn ich das mache, ohne zur Laufzeit eine Reihe hinzugefügt zu haben, dann bleibt meine Selektion bei der zweiten Reihe stehen und ich sehe sie noch.
Ich habe mir hier in dem Forum schon mehrere Beiträge, sowie das Tutorial zum Thema JTable durchgelesen, konnte aber auch da nichts finden, was mir weiterhilft.
Mein TableModel leite ich von vom AbstractTableModel ab welches sich (laut Informationen die ich hier gefunden habe) selber darum kümmert, dass die JTable aktualisiert wird, sobald sich dort was getan hat. Da dies allerdings nicht der Fall zu sein scheint, habe ich auch mal die passenden fire-Methoden aufgerufen, nachdem ich etwas an der JTable gemacht habe, allerdings blieb auch das ohne Erfolg.
Hier jetzt mal der Code, ich bin sicher ihr könnt mir damit weiterhelfen:
Mein TableModel
[HIGHLIGHT="Java"]class DownloadTableModel extends AbstractTableModel
{
private static final long serialVersionUID = 1L;
String[] headers = {"ContentId", "Filename", "Size", "Progress"};
@SuppressWarnings("unchecked")
Class[] columnClasses = {String.class, String.class, String.class, JProgressBar.class};
Vector<RowEntry> data = new Vector<RowEntry> ();
@Override
public int getColumnCount()
{
return headers.length;
}
@Override
public int getRowCount()
{
return data.size();
}
@SuppressWarnings("unchecked")
public Class getColumnClass(int c)
{
return columnClasses[c];
}
public String getColumnName(int c)
{
return headers[c];
}
public boolean isCellEditable(int r, int c)
{
return false;
}
@Override
public Object getValueAt(int r, int c)
{
RowEntry e = data.get(r);
switch (c)
{
case 0: return e.getContentId();
case 1: return e.getFilename();
case 2: return e.getSize();
case 3: return e.getProgressBar().getValue();
default: return null;
}
}
public void setValueAt(Object value, int r, int c)
{
}
public void addRow(String filename, String size)
{
int ID = getRowCount();
data.add(new RowEntry(String.valueOf(ID), filename, size, createProgressBar()));
fireTableRowsInserted(ID, ID); // Hier sage ich nochmal explizit, was ich hinzugefügt habe
}
public void removeRowAt(int r)
{
}
private JProgressBar createProgressBar()
{
JProgressBar pb = new JProgressBar(0, 100);
pb.setValue(0);
pb.setStringPainted(true);
return pb;
}
}[/HIGHLIGHT]
Mein TableCellRenderer:
[HIGHLIGHT="Java"]class DownloadTableRenderer extends JProgressBar implements TableCellRenderer
{
private static final long serialVersionUID = 1L;
public DownloadTableRenderer()
{
super(SwingConstants.HORIZONTAL);
this.setSize(115, 15);
}
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
if (value == null)
return this;
if (value instanceof JProgressBar)
setValue(((JProgressBar)value).getValue());
else
setValue(0);
return this;
}
}[/HIGHLIGHT]
Mfg. Patric
Zuletzt bearbeitet: