Swing TableCellRenderer für verschiedene Spalten

Status
Nicht offen für weitere Antworten.

heraklit

Mitglied
Hallo!

Seit gestern suche ich für das folgende Problem eine Lösung, habe aber bisher keine
gefunden. Vielleicht wisst ihr weiter.

Zunächst erzeuge ich in meinem Programm eine JTable mit der Bezeichnung table und setze anschließend für jede Spalte einen TableCellRenderer. Dadurch soll erreicht werden, dass die Zeilen in den ersten BEIDEN SPALTEN umgebrochen werden:

Java:
TARenderer tar = new TARenderer();
table.getColumnModel().getColumn(0).setCellRenderer(tar);
table.getColumnModel().getColumn(1).setCellRenderer(tar);

Der TableCellRenderer ist wie folgt implementiert:

Java:
public class TARenderer extends JTextArea implements TableCellRenderer 
{
  public TARenderer() 
  {
          super();
          setLineWrap(true);
          setWrapStyleWord(true);
  }
	
  public Component getTableCellRendererComponent(JTable table, Object obj, 
                                 boolean isSelected,  boolean hasFocus, int row, int column) 
  {
     setText((String) obj);		
     setSize(table.getColumnModel().getColumn(column).getWidth(), getPreferredSize().height);

     if(table.getRowHeight(row) != getPreferredSize().height) 
     table.setRowHeight(row, getPreferredSize().height);
     
     return this;
  }
}

Das Problem ist nun, dass permanent setRowHeight aufgerufen wird, da die CellRenderer der ersten beiden Spalten ständig ein repaint hervorrufen und sich gegenseitig beeinflussen. Das Problem kann man dadurch beseitigen, dass man den TARenderer ändert und folgende Abfrage setzt:
Java:
 if(table.getRowHeight(row) < getPreferredSize().height) 
     table.setRowHeight(row, getPreferredSize().height);
Das hat jedoch den Nachteil, dass sich die Zeilenhöhe nicht mehr reduziert wird.
Nun hab ich mir gedacht, dass man eine weitere Abfrage einfügt, wobei ein Parameter für die Mindeshöhe height bestimmt werden muss:
Java:
if(table.getRowHeight(row) > getPreferredSize().height && getPreferredSize().height > height)
     table.setRowHeight(row, getPreferredSize().height);
height bezeichnet dabei das Minimum über alle "Zellenhöhen" der betrachteten Zeile row.
Jedoch habe ich keine Ahnung, wie ich diese ermitteln kann.
Vielleicht gibt es ja auch eine Alternativlösung! Ich möchte nur erreichen, dass der Text in den ersten beiden Spalten einer JTable umgebrochen wird!

Gruß!
 
Zuletzt bearbeitet:

hdi

Top Contributor
JLabel zB unterstützt HTML, damit kannst du auch Zeilenumbrüche machen. (Nehme ich zumindest an, wissen tu ich's nicht).
Versuch mal sowas wie
Java:
setText("line</br>line2");
Also jetzt für den Fall dass dein Renderer ein JLable ist.
 

heraklit

Mitglied
Hallo,
das ist leider nicht mein Problem. Den Zeilenumbruch hab ich bereits erreicht.
Wenn man HTML verwendet müsste es wenn dann setText(<html>abc<br>def</html>) heißen...
Gruß und n8
 

KrokoDiehl

Top Contributor
Kann es nicht auch eine Lösung sein, wenn du die Höhe einmal (beim Erstellen der Tabelle) ausrechnest und dann im TableCellRenderer immer verwendest?
 

Michael...

Top Contributor
Ich würde mir eine Methode schreiben, die bei jeder Datenänderung durch die Zeilen der Tabelle iteriert und für jede Zelle (eventuell auch nur für die ersten zwei) die bevorzugte Höhe
Code:
getPreferredSize().height
der jeweiligen Renderer-Komponente abfragt. Den Maximalwert setzt man dann als Höhe für die gesamte Zeile.
 

heraklit

Mitglied
Hallo,

@KrokoDiehl: Die Daten werden eigentlich dynamisch gesetzt mit der TableModel Methode setDataVector.
@Michael: Und was machst du dann wenn das Fenster vergrößert wird und die Tabelle bei deinem Ansatz nicht neugezeichnet wird. Dasselbe Problem taucht auch in meinem Ansatz auf (wie oben beschrieben). Falls man die Tabelle verkleinert und dann wieder vergrößert (durch Veränderung der Fenstergröße), werden die Zeilenhöhen nicht angepasst. Das ist dann der Fall, falls man in der if-Abfrage des TableCellRenderers "<" statt "!=" verwendet, was einleuchtend sein dürfte.
Man muss schon einen TableCellRenderer, wie oben angedeutet, verwenden.
Nur wie?
 

Michael...

Top Contributor
Falls man die Tabelle verkleinert und dann wieder vergrößert (durch Veränderung der Fenstergröße), werden die Zeilenhöhen nicht angepasst.
Nur weil sich die Fenstergröße ändert, soll sich doch die Zeilenhöhe nicht ändern - ausser man benutzt kein ScrollPane. ???
Wenn Du innerhalb des Cellrenderes mit setRowHeight() setzt, bekommt man einerseits nicht immer die erforderliche Zeilenhöhe (Bsp. Zelle 1 benötigt 30px, Zelle 2 20px , der Renderer für Zelle 2 wird nach dem Rendering der Zelle 1 aufgerufen --> Zeilenhöhe 20px) und anderes ergibt das eine Endlosschleife, da das setzen der Zeilenhöhe ein erneutes Rendering auslöst in dem wiederum die Zeilenhöhe gesetzt wird und ...
 

Michael...

Top Contributor
Hier mal ein Bsp, wie ich es ähnlich mal bei mir eingesetzt habe. Verwende hier jetzt keinen speziellen Renderer, wichtig ist, dass die als Renderer verwendete Komponente einen entsprechenden Wert bei getPreferredSize() aus gibt - falls man verschachtelte Komponenten verwendet. Sollte für jeden Renderer funktionieren, der auf Standardkomponenten (wie z.B. JTextArea) zurückgreift.
Im Bsp wird die Zeilenhöhe bei Änderungen am Model neugesetzt, das deckt in der Regel die meisten Fälle ab, ansonsten kann man das ja selbst steuern bzw. anstossen.
Java:
import java.awt.*;

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;

public class TableRowHeightDemo extends JFrame {
	private JTable table;

	public TableRowHeightDemo() {
		table = new JTable(new Object[][] {
				{ "<html>test<br>test</html>", "test" },
				{ "test", "<html>test<br>test</html>" } },
				new Object[] { "A", "B" });
		this.getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
		this.setPreferredHeight();
		table.getModel().addTableModelListener(new TableModelListener() {
			public void tableChanged(TableModelEvent evt) {
				for (int row = evt.getFirstRow(); row <= evt.getLastRow(); row++) {
					setPreferredHeight(row);
				}
			}
		});
	}
	
	private void setPreferredHeight(int row){
		int height = table.getRowHeight();
		int h;
		Component comp;
		TableCellRenderer renderer;
		for (int column = 0; column < table.getColumnCount(); column++) {
			renderer = table.getCellRenderer(row, column);
			comp = table.prepareRenderer(renderer, row, column);
			h = comp.getPreferredSize().height;
			height = Math.max(height, h);
		}
		table.setRowHeight(row, height);
	}

	private void setPreferredHeight() {
		for (int row = 0; row < table.getRowCount(); row++) {
			this.setPreferredHeight(row);
		}
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				JFrame frame = new TableRowHeightDemo();
				frame.setBounds(0, 0, 500, 300);
				frame.setLocationRelativeTo(null);
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}
 

heraklit

Mitglied
Hallo,

@Michael:
Bei deiner Lösung wird kein Textumbruch durchgeführt, wenn man die Breite des Fensters verkleinert.
Ich denke, ich werde den CellRenderer, den ich unter obiger URL gefunden habe, verwenden.
Trotzdem danke schön!
 

Michael...

Top Contributor
Bei deiner Lösung wird kein Textumbruch durchgeführt, wenn man die Breite des Fensters verkleinert.
Du meinst wenn die Spaltenbreite verkleinert wird ?!?
Ich verwende in der Tabelle den DefaultRenderer (=JLabel) der kennt keinen Zeilenumbruch. Die Umbrüche, die Du in meinem Beispiel siehst sind durch html-Formatierung entstanden.
Wenn Du einen automatischen Zeilenumbruch haben willst, musst Du einen entsprechenden Renderer verwenden und sicherstellen, dass nach dem ändern der Spaltenbreite die Methode zum Setzen der Zeilenhöhe aufgerufen wird.

Und wie gesagt meine Methode funktioniert unabhängig vom Renderer, sofern die Rendererkomponente getPreferredSize() korrekt implementiert.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
M gleicher TableCellRenderer für mehrere unterschiedliche Tabellen AWT, Swing, JavaFX & SWT 5
B TableCellRenderer rendert Integer/Boolean Felder nicht AWT, Swing, JavaFX & SWT 4
M Swing TableCellRenderer elegant anpassen AWT, Swing, JavaFX & SWT 3
D Swing Mit TableCellRenderer einzelne Zellen markieren AWT, Swing, JavaFX & SWT 3
O Swing TableCellRenderer und JComboBox AWT, Swing, JavaFX & SWT 4
C Swing TableCellRenderer: setText() vs. setIcon() AWT, Swing, JavaFX & SWT 5
A Swing TableCellRenderer ändert die Zeilenfarbe zu spät AWT, Swing, JavaFX & SWT 3
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
J NullPointerException bei Benutzung vom TableCellRenderer AWT, Swing, JavaFX & SWT 3
U TableCellRenderer: Problem mit Timestamp/Date AWT, Swing, JavaFX & SWT 2
U TableCellRenderer UND prepareRenderer AWT, Swing, JavaFX & SWT 12
C Swing TableCellRenderer AWT, Swing, JavaFX & SWT 10
U TableCellRenderer und setBackground AWT, Swing, JavaFX & SWT 20
C Swing Problem mit TableCellRenderer in Verbindung mit TableRowSorter AWT, Swing, JavaFX & SWT 2
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 3
R JTable - TableCellRenderer - BufferedImage AWT, Swing, JavaFX & SWT 9
S TableCellRenderer: JLabel-Background in JPanel AWT, Swing, JavaFX & SWT 7
R JTable mit TableCellRenderer AWT, Swing, JavaFX & SWT 10
R JTable - TableCellRenderer AWT, Swing, JavaFX & SWT 2
D TableCellRenderer rendert einfach nicht! AWT, Swing, JavaFX & SWT 4
S TableCellRenderer setForeground AWT, Swing, JavaFX & SWT 5
I Problem mit TableCellRenderer AWT, Swing, JavaFX & SWT 3
K TableCellRenderer Problem AWT, Swing, JavaFX & SWT 3
F TableCellRenderer wie umsetzen? AWT, Swing, JavaFX & SWT 2
D JTable TableCellRenderer AWT, Swing, JavaFX & SWT 2
J JTable und TableCellRenderer AWT, Swing, JavaFX & SWT 2
G TableCellRenderer Background variiert darstellen AWT, Swing, JavaFX & SWT 3
P TableCellRenderer mit einem TableRowSorter AWT, Swing, JavaFX & SWT 4
D TableCellRenderer PRoblem AWT, Swing, JavaFX & SWT 3
G TableCellRenderer soll ganze ausgewählte Zeile markieren AWT, Swing, JavaFX & SWT 2
S TableCellRenderer deaktivieren AWT, Swing, JavaFX & SWT 13
J TableCellRenderer AWT, Swing, JavaFX & SWT 5
S JTree mal anders (TableCellRenderer) AWT, Swing, JavaFX & SWT 6
S TableCellRenderer, Performance AWT, Swing, JavaFX & SWT 9
M Objekt in TableCellRenderer packen, warum ein Fehler? AWT, Swing, JavaFX & SWT 2
T TableCellRenderer Problem AWT, Swing, JavaFX & SWT 6
B TableCellRenderer + JComboBoxen AWT, Swing, JavaFX & SWT 2
Juelin setzen background color für selected Row im Tableview AWT, Swing, JavaFX & SWT 21
Juelin Für Java-Spezialisten AWT, Swing, JavaFX & SWT 4
H JTabel - RowFilter Daten für Berechnung filtern AWT, Swing, JavaFX & SWT 6
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
M Eigene Java Klasse für allgemeine Grafikelemente AWT, Swing, JavaFX & SWT 8
M Vokabelprogram - Schleife für Liste soll schrittweise durchlaufen werden AWT, Swing, JavaFX & SWT 3
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
I Libraries für AWT für andere Grafik-Frameworks tauglich machen AWT, Swing, JavaFX & SWT 6
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
D JavaFX Schadensberechnung für Kartenspiel AWT, Swing, JavaFX & SWT 1
P JTable Listener für die Änderung einzelner Zellen oder Rows AWT, Swing, JavaFX & SWT 2
Jose05 JavaFX: eigene FXML-Datei für einen Button AWT, Swing, JavaFX & SWT 3
L actionListener für Button AWT, Swing, JavaFX & SWT 97
izoards Textfeld für Zeit AWT, Swing, JavaFX & SWT 4
CptK Wie funktioniert contains() für Path2D.Double AWT, Swing, JavaFX & SWT 10
T Getter und Setter für eine Stage AWT, Swing, JavaFX & SWT 6
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Button für GUI programmieren AWT, Swing, JavaFX & SWT 1
Z Switch Case für Buttons AWT, Swing, JavaFX & SWT 8
M Hough-Transformation für Kreise und andere Formen AWT, Swing, JavaFX & SWT 3
kodela HTML-tags für JLabel AWT, Swing, JavaFX & SWT 9
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
M Swing Cell Renderer für Zeilenumbruch in JTable AWT, Swing, JavaFX & SWT 0
MiMa Package Struktur für GUI Programmierung AWT, Swing, JavaFX & SWT 26
N JavaFX 1 Listener für mehrere ChoiceBoxen AWT, Swing, JavaFX & SWT 3
B eclipse für JavaFx setuppen AWT, Swing, JavaFX & SWT 4
K Swing Struktur für TreeTable rekursiv aufbauen AWT, Swing, JavaFX & SWT 17
A Swing JTextField an Button übergeben für Popup-Fenster funktioniert nicht AWT, Swing, JavaFX & SWT 3
H Ein Patten für das Gluon Mobile Framework AWT, Swing, JavaFX & SWT 7
J Gibt es einen Grund für 16x16 anstatt z.B. 15x15 Tiles ? AWT, Swing, JavaFX & SWT 10
F JFormattedTextField für kg und Währung AWT, Swing, JavaFX & SWT 6
V Swing für jedes Kästchen eine eigene Farbe AWT, Swing, JavaFX & SWT 2
F Wie bekomme ich den Wert der ComboBox in eine Variable gespeichert welche ich für meinen ActionListener nutzen kann? AWT, Swing, JavaFX & SWT 3
Soloeco JavaFX Dreifachklick für MenuButton erforderlich AWT, Swing, JavaFX & SWT 2
L JavaFX Lösungsvorschläge für dieses coole Control AWT, Swing, JavaFX & SWT 8
looparda Suche Lib für Visualisierung von Graphen AWT, Swing, JavaFX & SWT 12
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
L Ein Actionlistener für ein Textfeld, anstatt viele Actionlistener für ein Textfeld AWT, Swing, JavaFX & SWT 7
S Swing Finde Grund für NullPointerExeption nicht. AWT, Swing, JavaFX & SWT 2
W JavaFX (j)Unittests für GUI AWT, Swing, JavaFX & SWT 0
B JavaFX JavaFX TableView PropertyValueFactory für Werte aus HashMap AWT, Swing, JavaFX & SWT 2
SchmidiMC Swing Vorschläge für ein Design AWT, Swing, JavaFX & SWT 5
Z JavaFX Pane für wechselnde Sub-Panes mit Auto-Resize AWT, Swing, JavaFX & SWT 2
S 2D-Grafik affine Transformation für Text-Shape AWT, Swing, JavaFX & SWT 0
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
kodela Accalerator für einige Menüoptionen funktioniert nicht mehr AWT, Swing, JavaFX & SWT 3
P Swing Empfehlungen für einfaches Computerspiel AWT, Swing, JavaFX & SWT 4
L DragDropped für jede Node AWT, Swing, JavaFX & SWT 0
temi JavaFX Lösungsansatz für Umsetzung gesucht AWT, Swing, JavaFX & SWT 4
J Swing JavaProgramm für Verschlüssen für eine Datei AWT, Swing, JavaFX & SWT 19
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
MiMa Programmeinstellungen für Anwendung?? AWT, Swing, JavaFX & SWT 54
heinz ketchup While-Schleife in einem Service für GUI AWT, Swing, JavaFX & SWT 22
L JavaFX Renderer für JavaFX AWT, Swing, JavaFX & SWT 2
MiMa GUI Controller für Border Pane als MVC Modell AWT, Swing, JavaFX & SWT 1
L Font für Dashboard AWT, Swing, JavaFX & SWT 3
F Swing JColorChooser für die JToggleButtons AWT, Swing, JavaFX & SWT 5
S JavaFX Optimierung für verschiedene Auflösungen AWT, Swing, JavaFX & SWT 12
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
T Swing Drag and Drop für JComponents AWT, Swing, JavaFX & SWT 1
Kloso Swing Pseudocode für Strafurzeichnung AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben