# Zeilenhöhe einer JTable anpassen



## Guest (7. Feb 2005)

Wie kann ich die Zeilehöhe einer JTable immer optimal anpassen, wenn ich die JTable mittels renderer und editor erstellt habe und darin eine Textarea liegt.
Die Zeilehöhe soll immer so groß sein dass alle Textzeilen in der Textarea dargestellt werden.


----------



## abollm (7. Feb 2005)

Anonymous hat gesagt.:
			
		

> Wie kann ich die Zeilehöhe einer JTable immer optimal anpassen, wenn ich die JTable mittels renderer und editor erstellt habe und darin eine Textarea liegt.
> Die Zeilehöhe soll immer so groß sein dass alle Textzeilen in der Textarea dargestellt werden.



Wenn du einen entsprechenden Renderer hast, indem du ihn z.B. spaltenweise allen Zeilen deiner JTable zuweist:


```
...
   table = new JTable(model);
   table.getColumn(cols[0]).setPreferredWidth(100);
   table.getColumn(cols[1]).setPreferredWidth(150);
   table.getColumn(cols[2]).setPreferredWidth(250);
   // Zuweisen des Multiline-Cell-Renderers
   table.getColumn(cols[0]).setCellRenderer(new MultiLineCellRenderer());
   // Zuweisen eines Cell-Editors
   table.getColumn(cols[0]).setCellEditor(new TextEditor());
...
```

Hoffe, dir geholfen zu haben.


----------



## Gast (7. Feb 2005)

Versuch mal mit

table.setRowHeight(20);


----------



## abollm (7. Feb 2005)

Gast hat gesagt.:
			
		

> Versuch mal mit
> 
> table.setRowHeight(20);



Das war aber nicht gemeint, so wie ich die Frage verstanden habe. Der OP möchte ja eine dynamische Anpassung der Zeilenhöhe an den Zelleninhalt habe.

Das, was du vorschlägst, ist die Zuweisung einer konstanten Zeilenhöhe.


----------



## sofa-surfer (8. Feb 2005)

ich hab einfach ne methode geschrieben, die sich die preferredSize() von dem Zelleninhalt (also TextArea) nimmt und dann deren Höhe als Zeilenhöhe in der gerade geänderten Zeile setzt. jetzt mal ganz allgemein gesagt ....


----------



## jawohl (8. Feb 2005)

also ich habs bsi jetzt mal mit 

```
if (table.getRowHeight()!= (int) this.getMinimumSize().height) 
   table.setRowHeight(row, (int) this.getMinimumSize().height);
```
hinbekommen. Wenn ich jetzt allerdings etwas in der zeile ändere muss ich noch auf eine andere Zeile danach clicken damit sich die Zeile vergrößert oder verkleinert. Noch dazu kommt dass dieser code die ganze zeit neu ladet.

Hat jemand eine bessere Lösung - die ist nämich nicht wirklihc optimal.

Sofa-surfer, könntest du mir eventuell den code posten?


----------



## abollm (8. Feb 2005)

jawohl hat gesagt.:
			
		

> [..] hinbekommen. Wenn ich jetzt allerdings etwas in der zeile ändere muss ich noch auf eine andere Zeile danach clicken damit sich die Zeile vergrößert oder verkleinert. Noch dazu kommt dass dieser code die ganze zeit neu ladet.
> 
> Hat jemand eine bessere Lösung - die ist nämich nicht wirklihc optimal.
> 
> Sofa-surfer, könntest du mir eventuell den code posten?



Ich habe die von mir oben erwähnte Methode implementiert, d.h.

- Hinzufügen eines eigenen Cell-Editors
- spaltenweises Hinzufügen eines eigenen Cell-Renderers

Beim Ändern der in der betreffenden Spalte befindlichen Zelle muss ich nur noch diese Zelle Verlassen und schon wird die neue Größe angezeigt.

Ich denke, das von dir beschriebene Problem liegt daran, dass du zeilenweise wie folgt zuweist:



```
table.setRowHeight(row, (int) this.getMinimumSize().height);
```

anstatt spaltenweise (s. auch oben).

Der Vorteil liegt auf der Hand, denn bei einer spaltenweisen Zuordnung musst du nur in eine andere Zelle klicken, anstatt in eine neue Zeile.


----------



## sofa-surfer (9. Feb 2005)

weiß nicht ob der code soviel nützen wird für dein problem ....

```
private void resizeRow(int row)
    {
        table.setRowHeight(row, (((JTree)table.getValueAt(row, 0)).getPreferredSize()).height);
    }
```

Ist halt einfach nur das was ich schon oben geschrieben hab ....


----------



## jawohl (9. Feb 2005)

Ja nur das problem ist dass sich die zeile nicht erst bei einem Click in einer andere Zelle, Reihe, Spalte ändern soll sondern während ich in der Zelle, speziell in der Textarea schreibe bzw. den Text ändere. 
Daher denke ich mal dass ich dieses Problem mit einem Listener lösen muss. Nur welcher dafür geeignet wäre und wie weiß ich noch nicht so genau.


----------



## sofa-surfer (9. Feb 2005)

kenn mich jetzt in den tiefen des listener-universums nicht so aus (und hab gerad auch nicht nachgeschaut), aber zur  not lässt du die textarea von observable erben und die tabelle von observer. das wird wohl auf jeden fall gehen ....


----------



## Sky (9. Feb 2005)

Wenn ich dein Problem richtig verstehe, so soll sich die Zeilenhöhe quasi während der Eingabe ändern? 

Hier reicht ein einfacher KeyListener, der bei jedem Tastenklick prüft, ob die Höhe sich ändern muss.


----------



## jawohl (9. Feb 2005)

Also das hier ist mal mein Code inklusive Listener. Dummerweise macht er nur gar nichts wenn ich irgendwas ändere im Textfeld. Nicht mal jawohl gibt er aus . Weiß wer worans liegt?


```
public class MyTableCellRenderer extends JTextArea implements TableCellRenderer
{
    public MyTableCellRenderer() {
    	setLineWrap(false);
   	    setWrapStyleWord(true);
    	setEditable(true);
    	setOpaque(true);

    	
  }
  
  public KeyListener keyListener = new KeyAdapter() {
    public void keyTyped(KeyEvent e) {
    
      	System.out.println("JAWWWWWOOOOOOOOOOOOOOOOOOOOOHL");
      	
     /* 	    //Zeilenhöhe anpassen
    if (table.getRowHeight()!= (int) this.getMinimumSize().height) 
    table.setRowHeight(row, (int) this.getMinimumSize().height); */

    }
  };  
     		

	
	public Component getTableCellRendererComponent(JTable table, Object obj, boolean isSelected,
	 						boolean hasFocus, int row, int column) {

								
	    if (isSelected)
	    {
	    	
	    	
      		setForeground(table.getSelectionForeground());
      		setBackground(table.getSelectionBackground());
	    }	 
    	    else
     	    {
      		setForeground(table.getForeground());
      		setBackground(table.getBackground());
    	    } 
    	    
    	    setFont(table.getFont());
    	    
    if (hasFocus)
    {
	setBorder( UIManager.getBorder("Table.focusCellHighlightBorder") );
	
        if (table.isCellEditable(row, column))
        {
        	
        	setForeground( UIManager.getColor("Table.focusCellForeground") );
        	setBackground( UIManager.getColor("Table.focusCellBackground") );
        }
    }
    else
    {
       	setBorder(new EmptyBorder(1, 2, 1, 2));
    }
    
    //Text in die Textarea schreiben
    
    setText((obj == null) ? "" : obj.toString());							
    
	addKeyListener(keyListener);
     
	
  return this;
       
  }
  }
```


----------

