Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

JTabel - Renderer liefert unrealistische Zeilenhöhen

0 views
Skip to first unread message

Thomas Barth

unread,
Mar 14, 2004, 12:09:26 PM3/14/04
to
Hi,

ich verwende folgenden Renderer für meine Tabelle. Wenn es mal zuverlässig
funktionieren sollte, wird JTextPane noch ausgearbeitet. Aber in dieser
einfachen Version bekomme ich bereits falsche Zeilenhöhen geliefert, die mich
an den Gültigkeitsbereich eines Integers erinnern :o

import java.awt.*;
import javax.swing.*;
import javax.swing.table.*;
import javax.swing.text.*;

public class MyDefaultRenderer
extends JTextPane
implements TableCellRenderer {

private DefaultStyledDocument docDialog;
private Style styleDialog;

public MyDefaultRenderer() {
initGUI();
}

private void initGUI() {
setEditable(false);
setMargin(new Insets(5, 5, 5, 5));
setFont(new Font("Serif", Font.ITALIC, 12));
//textPane.setBackground(Color.decode(txtbg));
}

public Component getTableCellRendererComponent(
JTable table, Object value,
boolean isSelected,
boolean hasFocus,
int row, int col) {

setText((String)value);
return this;
}
}

Meine Tabelle erhält diesen Renderer mit dieser Anweisung:

tblDialog.setDefaultRenderer(Object.class, new MyDefaultRenderer());

So! Wenn ich die Spaltenbreite ermittel, funktioniert's noch, bei der
Zeilenhöhe nicht mehr. Hier beziehe ich mich auf die 2. Spalte und
bestimme die Höhe der zuletzt hinzugefügten Zeile. Die Kontroll-
ausgaben lassen meine Verzweiflung erahnen :-)

private void setPreferredRowHeight() {
int iHeight = 0;
int iRow = tblDialog.getRowCount() -1;

TableCellRenderer renderer = tblDialog.getCellRenderer(iRow, 1);

Component comp = renderer.getTableCellRendererComponent(
tblDialog, tblDialog.getValueAt(iRow, 1),
false, false, iRow, 1);
//tblDialog.setRowHeight(iRow, comp.getPreferredSize().height);
//System.out.println("Pref Höhe " + comp.getPreferredSize().height);

iHeight = comp.getMaximumSize().height;
System.out.println("Max Höhe " + iHeight);
//System.out.println("Max Höhe " + iHeight);

//tblDialog.setRowHeight(iRow, iHeight + 5);
tblDialog.setRowHeight(iRow, 50);
}

Ach, dann gibt's auch noch ne fette Fehlermeldung, aber nur, wenn
ich versuche die Zeilenhöhen zu bestimmen:

java.lang.NullPointerException
at javax.swing.plaf.basic.BasicTextUI$RootView.paint(Unknown Source)
at javax.swing.plaf.basic.BasicTextUI.paintSafely(Unknown Source)
at javax.swing.plaf.basic.BasicTextUI.paint(Unknown Source)
at javax.swing.plaf.basic.BasicTextUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.CellRendererPane.paintComponent(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCell(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paintCells(Unknown Source)
at javax.swing.plaf.basic.BasicTableUI.paint(Unknown Source)
at javax.swing.plaf.ComponentUI.update(Unknown Source)
at javax.swing.JComponent.paintComponent(Unknown Source)
at javax.swing.JComponent.paint(Unknown Source)
at javax.swing.JViewport.paintViewDoubleBuffered(Unknown Source)
at javax.swing.JViewport.paintView(Unknown Source)
at javax.swing.JViewport.flushViewDirtyRegion(Unknown Source)
at javax.swing.JViewport.setViewPosition(Unknown Source)
at javax.swing.JViewport.scrollRectToVisible(Unknown Source)
at javax.swing.JComponent.scrollRectToVisible(Unknown Source)

Ziemlich schmutzig das Ganze. Aber vielleicht hat jemand ne Idee,
die er mir schnell mitteilen möchte, bevor ich hier noch Schlimmeres
produziere.

Gruß,
Thomas


Sven Kiesewetter

unread,
Mar 15, 2004, 10:30:48 AM3/15/04
to
Thomas Barth wrote:

Was genau ist denn tblDialog ?

bei
iHeight = comp.getMaximumSize()
muss man immer beachten, dass nicht jede Component-Impl valide Werte
liefert, geschweige denn überhaupt etwas ungleich null.

JTable#setRowHeight triggert erfahrungsgemäß wieder Events, die die
Renderer zu einem Repaint veranlassen, wodurch wiederum deren
getTableCellRendererComponent-Methode ausführt wird. Da gerät man leicht
in eine Endlos-Rekursion.

Sven

Thomas Barth

unread,
Mar 15, 2004, 1:13:29 PM3/15/04
to
Hallo

>
> Was genau ist denn tblDialog ?
>

Ist eine Instanz von JTable.

> bei
> iHeight = comp.getMaximumSize()
> muss man immer beachten, dass nicht jede Component-Impl valide Werte
> liefert, geschweige denn überhaupt etwas ungleich null.

Vielleicht habe ich die Set-Methode übersehen, mit der ich angeben kann,
dass Texte mit Überlänge automatisch umgebrochen werden und die
Tabellenzeile halt alles an Zellentext darstellt. Gleich mal nachsehen. Aber
wenn es jetzt schon solche Problem gibt, wie soll es denn noch werden,
wenn kleine Grafiken in den Textzeilen eingefügt werden und die Texte
auch noch formatiert werden müssen (URLs, Farben, Sonderzeichen usw.) .

> JTable#setRowHeight triggert erfahrungsgemäß wieder Events, die die
> Renderer zu einem Repaint veranlassen, wodurch wiederum deren
> getTableCellRendererComponent-Methode ausführt wird. Da gerät man leicht
> in eine Endlos-Rekursion.

Ich teste gerade meine Tabelle (Chat)
mit einem IRC-Channel, in dem sich etwa 2000 Leute befinden. In einer Sekunde
können schon mal 5 - 10 neue Zeilen hinzukommen. Läuft jetzt seit einigen
Stunden soweit stabil, ohne die Breite und Höhenanpassung. Mit der Anpassung
erhalte ich noch falsche Werte.

Störend finde ich nochdas Flackern, sobald ich automatisches Scrollen
nach Hinzufügen einer Tabellenzeile einschalte.

tblDialog.scrollRectToVisible(tblDialog.getCellRect(iRowCnt, 0, true));

Irgendwie habe ich das Gefühl, dass ich das Projekt kippen muss, weil
ich mit Java meine Vorstellungen nicht realisieren kann.

Gruß,
Thomas


Sven Kiesewetter

unread,
Mar 16, 2004, 2:39:33 AM3/16/04
to

Wenn ich das richtig verstehe, willst dazu Tabellenzellen haben, die
Text mehrzeilig und automatisch umbrechend darstellen und die
entsprechende Tabellenzeile entsprechende vergrößern. Richtig ?
Ich hab sowas mal umgesetzt und es funktionierte auch ganz gut. Wenn du
willst, such ich das mal raus.

Was das Scrolling angeht: versuch das mal über die Scrollpane und nicht
die JTable zu steuern, das könnte helfen.

Sven

Thomas Barth

unread,
Mar 16, 2004, 11:02:00 AM3/16/04
to
Hallo Sven

> Wenn ich das richtig verstehe, willst dazu Tabellenzellen haben, die
> Text mehrzeilig und automatisch umbrechend darstellen und die
> entsprechende Tabellenzeile entsprechende vergrößern. Richtig ?
> Ich hab sowas mal umgesetzt und es funktionierte auch ganz gut. Wenn du
> willst, such ich das mal raus.

Ja, würde mich sehr interessieren. Ich hatte das Ganze jetzt mal über
eine HTML-Tabelle versucht, leider ist das Neusetzen des Dokumentes
nicht performant. Der Neubau des HMTL-Dokumentes, wenn eine Zeile
hinzugekommen ist, wäre ja noch zu verkraften, aber das Setzen des
Dokumentes führt wieder zu einem "optischen Bruch". Aber wenigtens
konnte ich mal meine gewünschten Aufteilung der Texte sehen.
Es geht mir wirklich nur um eine zweispaltige Aufteilung der Texte mit
der Formatierungsmöglichkeit von JTextPane.

> Was das Scrolling angeht: versuch das mal über die Scrollpane und nicht
> die JTable zu steuern, das könnte helfen.

Also wenn es über Scrollpane funktioniert, dann wäre es auf jeden Fall
flüssig. Mit der Maus den Scrollbalken zu bewegen führt nämlich nicht zum
Flackern der Tabelle.


Gruß,
Thomas


0 new messages