# JTable, Zeilenumbruch in Zellen



## T1M (14. Jun 2005)

Hi,
ich hab ne JTable und da mit 
	
	
	
	





```
table.setRowHeight(table.getRowHeight() + 25);
```
die zeilenhöhe verändert.
wie geht es das der text jetzt oben links anfängt und es automatisch einen zeilenumbruch gibt, wenn das ende der zelle erreicht wird.
ich möchte also 2, oder 3 zeilen zum beschriften in jeder zelle haben.
Bsp.:

```
|----------------------|------|-----------|
| lala blabla ...      | ...  | ...       |
| texttexttexttext     | ...  | ...       |
| auch noch text       | ...  | ...       |
|----------------------|------|-----------|
```
THX anyway,
   T1M


----------



## timomeinen (14. Jun 2005)

Der CellRenderer liefert JLabels. Daher kannst du einfach HTML verwenden:

<html>lala blabla 

texttexttexttext  

auch noch text  </html>

Du kannst dir auch einen eigenen CellRenderer schreiben, der von einer Component abgeleitet ist, die Zeilenumbrüche beherrscht. Dazu musst du dann TableCellRenderer implementieren.


----------



## T1M (14. Jun 2005)

hmm, ich verwende schon n cellrenderer. den brauch ich fürs färben des hintergrundes.
kann ich des html-krusch einfach so verwenden?
und wie schaut das aus, wenn ich in die tabelle was reinschreiben will. also, doppelklick auf ne zelle und reinschreiben. da muß er mir ja auch n umbruch setzen ...

edit: und wo genau kann ich das html reinschreiben?


----------



## timomeinen (14. Jun 2005)

HTML kannst du einfach schreiben, wo du sonst auch deinen Text ausgibst. Du musst nur ein <html> davor und ein </html> dahinter machen. Bei jedem Zeilenumbruch fügst du ein 
 ein.

Bei TextAreas lässt sich der Zeilenumbruch durch  
	
	
	
	





```
setLineWrap(true)
```
 aktivieren.


----------



## T1M (14. Jun 2005)

ja gut, das klappt.
aber wenn ich per doppelklick in die zelle gehe und da was reinschreiben will. wie mach ich dann das?


----------



## Sky (14. Jun 2005)

Warum läßt Du deinen Renderer nicht von JTextArea oder JTextPane erben? Dann kannste den ganzen HTML-Quatsch lassen


----------



## T1M (14. Jun 2005)

und wie?

```
class ColorTableCellRenderer extends DefaultTableCellRenderer
{ ... }
```
das mit dem html wird ja eh net so gehn, wenn ich während der laufzeit was in die tabelle schreibe.


----------



## Sky (14. Jun 2005)

```
extends JTextArea
```
bzw.

```
class ColorTableCellRenderer implements TableCellRenderer {

  private JTextArea ta;

  public ColorTableCellRenderer () {
    ta = new JTextArea();
  }

  public Component getTableCellRendererComponent( JTable table, Object value,
                                                  boolean isSelected,
                                                  boolean hasFocus, int row,
                                                  int column ) {
    
    // mach was mit ta, z.B. setText(value.toString());
    return ta;
  }
}
```


----------



## timomeinen (14. Jun 2005)

sky80 hat gesagt.:
			
		

> ```
> extends JTextArea
> ```



dann muss da noch das implements TableCellRenderer


```
extends JTextArea implements TableCellRenderer
```


----------



## Sky (14. Jun 2005)

timomeinen hat gesagt.:
			
		

> dann muss da noch das implements TableCellRenderer


ja richtig


----------



## T1M (14. Jun 2005)

da bekomm ich jetzt aber einen "java.lang.StackOverflowError"
und das fenster ist grau. man sieht keine buttons, keine table, ...


----------



## Sky (14. Jun 2005)

T1M hat gesagt.:
			
		

> da bekomm ich jetzt aber einen "java.lang.StackOverflowError"
> und das fenster ist grau. man sieht keine buttons, keine table, ...


Zeig mal deinen Code


----------



## T1M (14. Jun 2005)

der renderer:

```
import javax.swing.table.*;
import java.awt.*;
import java.awt.Color;
import javax.swing.*;
import java.util.Arrays;

class ColorTableCellRenderer extends JTextArea implements TableCellRenderer
{
  private boolean[][] isHighlighted;
  private String[] arr;
  
  public Component getTableCellRendererComponent(JTable table, Object value,
  												 boolean isSelected, boolean hasFocus,
												 int row, int column)
  {
    if (isHighlighted == null)
    {
      isHighlighted = new boolean[table.getRowCount()][table.getColumnCount()];
    }


    getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
    if (isHighlighted[row][column])
    {
     setBackground(Color.RED);
    }
   
    else
    {
    	getTableCellRendererComponent(table, table.getValueAt(row, column), isSelected,
                hasFocus, row, column);
      setBackground(table.getBackground());
    }
  
    return this;
  }

  public void setHighlighted(final int row, final int column, final boolean highlight)
  {
    isHighlighted[row][column] = highlight;  //um eine zelle zu färben
  }
  
  public void setHighlighted( final int row, final boolean highlight )
  { 
  	Arrays.fill( isHighlighted[row], highlight ); //um ganze zeile zu färben
  }


	public static void main(String[] args)
	{
		
	}
}
```

also, den fehler gibts erst beim compilieren.


----------



## Wildcard (14. Jun 2005)

```
getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
```
Die Methode ruft sich immer wieder selbst auf


			
				T1M hat gesagt.:
			
		

> Um Rekursivität zu verstehen, muß man Rekursivität verstehen!


  :lol:


----------



## T1M (14. Jun 2005)

nja, vorher stand da auch
	
	
	
	





```
super. getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
```
 das super musste weg, weils nimmer extends DefaultTableCellrenderer heißt ...


----------



## Wildcard (14. Jun 2005)

T1M hat gesagt.:
			
		

> nja, vorher stand da auch
> 
> 
> 
> ...


Ist aber ein kleiner Unterschied  :wink:


----------



## T1M (14. Jun 2005)

hab ja auch nie behauptet es drauf zu haben!
es lief, ich war zufrieden.


----------



## Sky (14. Jun 2005)

naja, wenn Du nicht mehr von Default... ableitest, dann musst Du die Methoden von JText... benutzen.
(setText, setBackground usw.)


----------



## T1M (14. Jun 2005)

oh ne hey. nich schon wieder den renderer umschreiben ...  
gibts da keine andere möglichkeit 3 zeilen schrift in eine zelle zu packen?


----------



## Sky (14. Jun 2005)

T1M hat gesagt.:
			
		

> oh ne hey. nich schon wieder den renderer umschreiben ...
> gibts da keine andere möglichkeit 3 zeilen schrift in eine zelle zu packen?


Doch html... dann wird's nur ein bichen kompliziert, wenn das jemand editieren soll...


----------



## T1M (14. Jun 2005)

damn, genau sowas dacht ich mir schon ...
naja, dann muß es halt so sein. :?  hilft ja nüx!


----------



## Sky (14. Jun 2005)

T1M hat gesagt.:
			
		

> damn, genau sowas dacht ich mir schon ...
> naja, dann muß es halt so sein. :?  hilft ja nüx!


Es ist wirklich keine Kunst, denn in super.getTableCellRendererComponent werden nur Farben gesetzt und der Wert dem Label zugewiesen... dass sind in deinem Fall vielleicht 3-4 Codezeilen mehr...


----------



## T1M (14. Jun 2005)

echt? na, mal schaun ob ichs hinbekomm.


----------



## Sky (14. Jun 2005)

T1M hat gesagt.:
			
		

> echt? na, mal schaun ob ichs hinbekomm.


Hier mal in Kurzform, was sich im Default-Renderer abspielt:


```
setForeground()
setBackground()
setFont()
setBorder()
setText()
return
```


----------

