Camickrs Lösung hat bei mir überhaupt nicht funktioniert. Mein Datenmodell war jedoch dynamisch - es änderte sich ständig. Ich denke, die erwähnte Lösung funktioniert für statische Daten, wie sie von einem Array kommen.
Ich hatte JPanel für Cell Renderer-Komponente und seine bevorzugte Größe wurde nicht korrekt nach der Verwendung von prepareRenderer (...) festgelegt. Die Größe wurde korrekt eingestellt, nachdem das umschließende Fenster bereits sichtbar war und neu gezeichnet wurde (2 Mal tatsächlich nach einer nicht spezifizierten, jedoch kurzen Zeit). Wie kann ich die updateRowHeights() -Methode aufrufen, die oben gezeigt wird und wo würde ich das tun? Wenn ich es (overrienden) Table.paint() anrief, verursachte es offensichtlich unendliche Repaints. Ich habe 2 Tage gebraucht. Buchstäblich. Die Lösung, die für mich arbeitet, ist diese (das ist der CellRenderer, den ich für meine Spalte verwendet habe):
public class GlasscubesMessagesTableCellRenderer extends MyJPanelComponent implements TableCellRenderer {
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
//this method updates GUI components of my JPanel based on the model data
updateData(value);
//this sets the component's width to the column width (therwise my JPanel would not properly fill the width - I am not sure if you want this)
setSize(table.getColumnModel().getColumn(column).getWidth(), (int) getPreferredSize().getHeight());
//I used to have revalidate() call here, but it has proven redundant
int height = getHeight();
// the only thing that prevents infinite cell repaints is this
// condition
if (table.getRowHeight(row) != height){
table.setRowHeight(row, height);
}
return this;
}
}
Benötige ich ein Tabellenmodell dafür? – Wulf
Warum ClassCastException abfangen? Es gibt keine Umwandlungen oder irgendwelche ungeprüften Operationen. –
@KarlRichter, guter Punkt, nicht sicher, warum es da ist. Der Versuch/Fang wurde entfernt. – camickr