# JTextArea in JScrollPane verkleinert sich nicht mehr



## LikeBlue (29. Aug 2008)

Hallo,
folgende Problemstellung:

Ich habe in einem Fenster ein JScrollPane, darin ein JPanel in dem dann (unter anderem) eine JTextArea befindet.

Komponentenübersicht:






Wenn ich nun das Fenster vergrößere, so vergrößert sich wie gewollt auch die JTextArea, jedoch verkleinert sie sich nicht mehr, wenn ich das Fenster wieder verkleinere. Das sieht dann so aus:









Wie man sieht, ist der Rest des Textes (bzw. der TextArea) einfach abgeschnitten.

Das gleiche Problem tritt außerdem auch mit JEditorPane auf. Verwende ich stattdessen JTextPane, so erfolgen generell keine Zeilenumbrüche (der restliche Text ist abgeschnitten).

Kann jemand dieses Problem lösen? 
(Möglich sind auch alternative Komponenten, sofern sie in diesem Zusammenhang [JScrollPane] funktionieren)

*Quellcode:*

```
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.BoxLayout;
import javax.swing.JScrollPane;
import javax.swing.JLabel;
import javax.swing.JTextArea;

public class test extends JFrame {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JScrollPane jScrollPane = null;

	private JPanel jPanel = null;

	private JLabel jLabel = null;

	private JLabel jLabel1 = null;

	private JTextArea jTextArea = null;

	public test() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BoxLayout(getJContentPane(), BoxLayout.Y_AXIS));
			jContentPane.add(getJScrollPane(), null);
		}
		return jContentPane;
	}

	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
			jScrollPane.setViewportView(getJPanel());
			jScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
		}
		return jScrollPane;
	}

	private JPanel getJPanel() {
		if (jPanel == null) {
			jLabel1 = new JLabel();
			jLabel1.setText("JLabel");
			jLabel = new JLabel();
			jLabel.setText("JLabel");
			jPanel = new JPanel();
			jPanel.setLayout(new BoxLayout(getJPanel(), BoxLayout.Y_AXIS));
			jPanel.add(jLabel, null);
			jPanel.add(jLabel1, null);
			jPanel.add(getJTextArea(), null);
		}
		return jPanel;
	}

	private JTextArea getJTextArea() {
		if (jTextArea == null) {
			jTextArea = new JTextArea();
			jTextArea.setWrapStyleWord(true);
			jTextArea.setLineWrap(true);
			jTextArea.setText("ANFANG text [...] text 1234567890 ENDE");
		}
		return jTextArea;
	}

}
```

Vielen Dank im Voraus
LikeBlue


----------



## Ariol (29. Aug 2008)

Blödsinn...


----------



## LikeBlue (29. Aug 2008)

Ariol hat gesagt.:
			
		

> Blödsinn...



Oh, sehr freundliche Begrüßung hier deinerseits. Dürfte ich auch bitte erfahren, was hier _Blödsinn_ sein soll?


----------



## SlaterB (29. Aug 2008)

das war wohl eine Löschung eines eigenen Beitrags, der nur Blödsinn enthielt


----------



## Wildcard (29. Aug 2008)

Dieses Verhalten wird durch das Scrollable Interface gesteuert. Die JTextArea implementiert dieses Bereits.
Entscheidend ist die Methode getScrollableTracksViewPortWidth.
Bei JTextArea ist sie so implementiert:
http://java.sun.com/javase/6/docs/api/javax/swing/JTextArea.html#getScrollableTracksViewportWidth()


----------



## LikeBlue (29. Aug 2008)

SlaterB hat gesagt.:
			
		

> das war wohl eine Löschung eines eigenen Beitrags, der nur Blödsinn enthielt



Achso, das habe ich dann wohl falsch interpretier. Sorry @ Ariol :wink:


----------



## SlaterB (29. Aug 2008)

@WildCard
scheint nur aufgerufen zu werden, wenn die JScrollBar die JTextArea direkt enthält,
dann gibts auch kaum Probleme,

aber das Zwischen-JPanel hier machts kaputt


----------



## Wildcard (29. Aug 2008)

Ach, das mit dem Zwischenpanel ist mir entgangen und dann das eigentliche Problem.
Dann muss es eine von JPanel abgeleitete Klasse sein, die das Scrollable Interface sinnvoll implementiert.
Sprich, getScrollableTracksViewportWidth muss true liefern (oder sich an die Vorgabe der TextArea halten) und getPreferredScrollableViewportSize() muss die Werte der TextArea verwenden und in der Höhe das Label dazu zählen.
So ungefähr...


----------



## LikeBlue (31. Aug 2008)

Vielen Dank für die schnelle und kompetente Hilfe :toll:

Falls jemand das gleiche Problem noch mal haben sollte, hier die Lösung für ein entsprechend erweitertes JPanel:


```
import javax.swing.JPanel;
import javax.swing.Scrollable;
import java.awt.Dimension;
import java.awt.Rectangle;

public class JPanelExtended extends JPanel implements Scrollable {
	
	public JPanelExtended() {
		super();
	}
	
	public Dimension getPreferredScrollableViewportSize() {
		return getPreferredSize();
	}
	
	public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
		return 0;
	}
	
	public boolean getScrollableTracksViewportHeight() {
		return true;
	}
	
	public boolean getScrollableTracksViewportWidth() {
		return true;
	}
	
	public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
		return 0;
	}
}
```

Falls sich das Panel in der Höhe dem Inhalt anpassen soll (anstatt der Fensterhöhe):

```
public boolean getScrollableTracksViewportHeight() {
		return false;
	}
```


----------

