# JTextArea + neue Zeile



## jawohl (31. Jan 2005)

Also ich habe ein JTextarea in eine jtable gepackt. Das klappt mal wunderbar. Nun hab ich aber das folgende problem:

der Text den ich habe zb ("jawohl\njawohl2\njawohl3) wird wunderbar in 3 zeilen angezeigt. Wenn ich jetzt aber einen Doppelclick auf die Area mach schreibt sie ihn mir in eine Zeile und blendet die \n aus.

Dann möchte ich dass ich bei enter-drücken eine neue Zeile eröffne und bei BACK (Ich hoffe so heißt die Taste) - drücken eine Zeile gelöscht wird. Falls dies zu aufwendig gehen 2 Buttons auch . Welche Events brauch ich da so um dies realisieren zu können:
ich hätte da mal an einen keyEvent gedacht - aber dies bezieht sich doch wieder auf die ganze applikation oder?


----------



## dotlens (1. Feb 2005)

jawohl hat gesagt.:
			
		

> ich hätte da mal an einen keyEvent gedacht - aber dies bezieht sich doch wieder auf die ganze applikation oder?


Der KeyEvent wird von der Komponente ausgelöst, von der ein KeyListener hinzugefügt wurde. Also musst du einfach:

```
JTextArea area = new JTextArea("text1\ntext2\ntext3\n");
area.addKeyListener(this);
```
zur Textarea einfügen und den KeyListener richtig implementieren.


----------



## Guest (1. Feb 2005)

statt *\n* kannst du auch *System.getProperty("line.separator")* verwenden, dadruch wird der Zeilenumbruch plattformunabhängig. Windows und Linux haben da ja zB auch Unterschiede


----------



## Guest (1. Feb 2005)

Also bis jetzt hab ich mal  das in meinem Renderer für die Tabelle geschrieben. Compilieren usw. lässt er sichwunderbar, nur macht er nicht das was ich mir bei TastenDruck wünsche. Er schreibt einfach "q" und das wars.
Weiß jemand woran dasliegen könnte? und wie ich einen Enterdruck schreiben müsste im Code.

Wäre wiedermal für jede hilfe mehr als dankbar.


Hier der Renderer

```
public class MultiLineRenderer extends JTextArea implements TableCellRenderer
{
    public MultiLineRenderer() {
    	setLineWrap(false);
    	setWrapStyleWord(true);
    	setEditable(true);
    	setOpaque(true);
  }
  
	
	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));
    }
    setText((obj == null) ? "" : obj.toString());
    
    
    
    this.addKeyListener(new java.awt.event.KeyAdapter() {
         public void keyTyped(java.awt.event.KeyEvent evt) {
                textareaKeyTyped(evt);
            }
        });
    
  return this;
        
  }
    
        
  


private void textareaKeyTyped(java.awt.event.KeyEvent evt) {
    char taste = evt.getKeyChar();
    
    if (taste=='q')
    	{
    	insert("Jawohl\n",getCaretPosition());
    	repaint();
	}
    if (taste=='w')
    	{
    		
    	
	}

     }   
    
}
```


----------



## mr1st (1. Feb 2005)

probier mal *evt.consume();*
Dadurch wird nur dein Listener verwendet, der fix integrierte Listener von deiner Superklasse (JTextarea) wird dann nicht mehr ausgeführt.


----------



## Illuvatar (1. Feb 2005)

Mit evt.consume werden die danach kommenden Listener nicht mehr ausgeführt. Laut Sun gibt es aber keine Garantie, dass diese in irgendeiner bestimmten Reihenfolge ausgeführt werden.


----------



## mr1st (1. Feb 2005)

Bei mir wurden bisher meine eigenen Listener immer vorher ausgeführt. Muss aber nicht heißen, dass es immer so ist, vielleicht hatte ich nur Glück


----------



## Illuvatar (1. Feb 2005)

Ich glaube z.Zt. geht das echt LIFO mäßig, aber Sun garantiert eben nicht, dass das so bleibt


----------



## jawohl (2. Feb 2005)

versteh ich nicht ganz, was es mit dem consume() auf sich hat und wie der verwendet werden soll.

Jedenfalls glaub ich jetzt einmal das Problem herausgefunden zu haben. Und zwar wenn ich ein Normales TextPane oder eine normale TextArea erstelle kann ich mit enter und der einen Löschen taste immer eine Zeile hinzufügen und weglöschen - standardmäßig. Jedoch ist das bei der Textarea (Oder auch Textpane - hab ich auhc schon probiert) in meiner JTable nicht mehr der fall. Stattdessen springt es einfach aus der TextareaZelle hinaus bei Enter-drücken. 

Hat jemand eine Ahnung wie ich das umgehen kann?


----------



## Stefan1200 (2. Feb 2005)

Dann wird der Listener von der JTable vorher ausgeführt.
Müsstest du das unterbinden.


----------

