JTextArea in JScrollPane verkleinert sich nicht mehr

Status
Nicht offen für weitere Antworten.

LikeBlue

Mitglied
Hallo,
folgende Problemstellung:

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

Komponentenübersicht:
uebersicht.png


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:
JTextArea_groesser.png

JTextArea_kleiner.png


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:
Code:
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 🙂
 
das war wohl eine Löschung eines eigenen Beitrags, der nur Blödsinn enthielt
 
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()
 
@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
 
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...
 
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:

Code:
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):
Code:
	public boolean getScrollableTracksViewportHeight() {
		return false;
	}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben