Spaltenüberschrift bei J(Tree)Table mehrzeilig?

Moin moin,
gibt es eine (vermutlich gar mehrere) Möglichkeit, die Spaltenüberschriften eines JTables/JTreeTables mit Zeilenumbruch anzeigen zu lassen, falls der vorhandene Text nicht in die Spaltenbreite passt? Einzige Bedingung: Die Spalten sollen weiterhin vertauschbar sein.
Evtl. kommen später auch mal Icons zu dem mehrzeiligen Spaltenüberschriftstext, aber das ist sekundär und Zukunftsmusik.

TIA!
Harald

versuchs mit einem newline-char:

String Überschrift = „1. Zeile \n 2. Zeile \n 3. Zeile“;

oder HTML-code:

String Überschrift = „1. Zeile
2. Zeile
3. Zeile“;

ein von beiden müsste gehen. (HTML geht in TreeNodes und Textfelderen sicher, Überschriften hatte ich noch nicht.)

cu

Danke für den Tip, hatte ich aber beides bereits erfolglos probiert. :frowning:
Scheint interessanterweise nicht trivial lösbar zu sein.

Für LiveTable (JClass) gibt es wohl etwas namens JCWordWrapCellRenderer oder JCStringCellRenderer, kann ich aber beides nicht benutzen.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

dann auf die harte Tour.

Danke für den Tip, hatte ich aber beides bereits erfolglos
probiert. :frowning:
Scheint interessanterweise nicht trivial lösbar zu sein.

Dann auf die harte Tour (allerdings nur für JTable, für JTree hab ich noch nichts, müsste ähnlich gehen):

erzeug die Table mit:
JTable(TableModel dm, TableColumnModel cm)

davor legts du mit cm.setHeaderRenderer(TableCellRenderer headerRenderer) den Header-renderer selbst fest. TableCellRenderer ist ein Interface, du hast also freie Hand.

dieses hat nur eine Methode:
Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column);

In dieser Methode kanns du ein java.awt.Component deiner Wahl (Tip: JTextArea) erzeugen.

Allerdings werden resize und Positionsänderungen nicht direkt durchgemeldet, bau die TextArea also möglichst generisch.

cu

Dann auf die harte Tour (allerdings nur für JTable, für JTree
hab ich noch nichts, müsste ähnlich gehen):

erzeug die Table mit:
JTable(TableModel dm, TableColumnModel cm)

davor legts du mit cm.setHeaderRenderer(TableCellRenderer
headerRenderer) den Header-renderer selbst fest.

Das TableColumnModel hat keine solche Funktion. Es gibt sie im TableModel.

Meine halbfertige Lösung sieht bisher so aus:

String HTMLText = „Durchschnittl. Anzahl
aufgeblasener Sumpfmolche pro Tümpel“;
CustomDefaultTableCellRenderer DTCR = new CustomDefaultTableCellRenderer();
// DTCR.setMinimumSize(new Dimension(100,100));
DTCR.setValueHF(HTMLText);

TableColumn actTableColumn = (TableColumn) jTable1.getColumn(„Name“);
if (actTableColumn != null){
actTableColumn.setHeaderRenderer(DTCR);
}

Mit:

public class CustomDefaultTableCellRenderer extends DefaultTableCellRenderer {

public CustomDefaultTableCellRenderer() {
}
public void setValueHF(String s)
{
if (s.equals("") == false){
setValue(s);
}
setText(s);
}
}
Ich weiss jetzt nur nicht, wie ich
actTableColumn.setHeaderRenderer(DTCR);
in die JTable bekomme. Den HeaderRenderer habe ich jetzt für TableColumn, aber wie bekomme ich das als TableColumnModel zwecks Übergabe an JTable umgedreht?

Und im Moment zeigen sich zwar Ansätze zur mehrzeiligen Anzeige, aber nur bis zu einer bestimmten Grenze. Es wird nicht der komplette Text angezeigt.

cu

Harald

Hallo,

schau dir doch das mal an:
http://www.esus.com/docs/GetQuestionPage.jsp?uid=1284

Gruß
Jochen

Interessanter Link. Ich habe es endlich etwas einfacher realisiert:

public void aendernTabellenkopf(){
String AnzText = „Anzahl\ngrüner\nSumpfmolche\npro Tümpel“;
CustomDefaultTableCellRenderer DTCR = new CustomDefaultTableCellRenderer(AnzText);
TableColumn actTableColumn = (TableColumn) jTable1.getColumn(„Name“);
if (actTableColumn != null){
actTableColumn.setHeaderRenderer(DTCR);
}
JTableHeader Tabellenkopf = jTable1.getTableHeader();
Tabellenkopf.repaint();
}

Und:

public class CustomDefaultTableCellRenderer extends DefaultTableCellRenderer {

private String AusgabeText = „“;

public CustomDefaultTableCellRenderer(String AuszugebenderText) {
AusgabeText = AuszugebenderText;
}
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
JTextArea Textfeld = new JTextArea(AusgabeText,5,1); // 5 Zeilen, 1 Spalte
return Textfeld;
}
}

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich weiss jetzt nur nicht, wie ich
actTableColumn.setHeaderRenderer(DTCR);
in die JTable bekomme. Den HeaderRenderer habe ich jetzt für
TableColumn, aber wie bekomme ich das als TableColumnModel
zwecks Übergabe an JTable umgedreht?

Table.getColumnModel().getColumn(index).setHeaderRenderer(Renderer)

?

Und im Moment zeigen sich zwar Ansätze zur mehrzeiligen
Anzeige, aber nur bis zu einer bestimmten Grenze. Es wird
nicht der komplette Text angezeigt.

setz das Textfeld in ein scrollPanel.

Ich muss sagen der andere Link ist einfacher.

cu

Erledigt anyway

Und im Moment zeigen sich zwar Ansätze zur mehrzeiligen
Anzeige, aber nur bis zu einer bestimmten Grenze. Es wird
nicht der komplette Text angezeigt.

setz das Textfeld in ein scrollPanel.

Ich habe jetzt erst mal ein abgeleitetes JPanel genommen, der Flexibilität wegen. Da kann noch eine CheckBox, Label usw. hinein.

Ich muss sagen der andere Link ist einfacher.

cu

Ist Geschmackssache, einfacher ist die Lösung m.E. nicht, sie ist meiner sehr ähnlich.
Ist aber auch egal, es ging ja darum, einen Tabellenkopf mehrzeilig zu gestalten, und das ist nun erledigt. :smile: