Probleme mit JTextArea und Größenänderung des JFrames

Kerwin

Erfahrenes Mitglied
Hallo ihr da

Ich habe derzeit ein komisches Problem wo ich irgendwie nicht Herr der Lage werde.
Ich habe ein JFrame, darauf packe ich ein JPanel, welches JScrollBars hat. Auf dieses JPanel packe ich wiederum ein JTextarea mit den Einstellungen, dass es Zeilen umbrechen soll, wenn sie zu lang sind. Klappt auch alles wunderbar.

Nun zum Problem:
Wenn ich das JFrame (also das Windowsfenster) vergrößere, vergrößert sich automatisch das JTextarea mit (so gewollt). Wenn ich es aber nun wieder verkleinern will, bleibt das JTextArea auf der größe von zuvor. Sprich, ich kann das zwar immer weiter vergrößern, aber nicht mehr verkleinern. Beim Verkleinern kommen die Scrollbars zum vorschein damit ich in dem größeren Textarea rumnavigieren kann.

Das lustige ist, nehme ich den setLineWrap heraus, funktioniert es mit dem vergrößern und verkleinern.

Probiert es einmal selbst aus ^^

Hat vielleicht jemand eine Lösung? Mein Ziel ist es, dass sich das JTextArea dynamisch mit der Größe des Fensters (JFrame) mitändert.

Ja, in dieser Testanwendung(Dummy) erscheint es unnötig ein JScrollPane auf das JPanel zu packen, jedoch in meiner richtigen Anwendung ist es später einmal vielleicht nötig. Es geht halt ums Prinzip ;)

Java:
import java.awt.BorderLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class PanelTest extends JFrame {
	
	public static void main(String args[]){
		new PanelTest().setPanel();
	}
	
	public void setPanel(){
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				System.exit(0);
			}
		});
		
		this.setLayout(new BorderLayout());
		this.setSize(200, 200);
		
		JPanel 		pa_frame 	= new JPanel(new BorderLayout());
		JScrollPane jsp 		= new JScrollPane(pa_frame);
		this.add(jsp);
			
		JTextArea ta_text = new JTextArea();
		
		ta_text.setLineWrap(true);
		ta_text.setWrapStyleWord(true);
		
		
		pa_frame.add(ta_text);
		
		this.add(jsp);
	
		this.setVisible(true);
	}
}
 
Zuletzt bearbeitet:
Hallo,

vorab du addest in denem Beispiel "jsp" 2 mal und nicht in den ContentPane, sondern
ins RootPane des JFrames !!

Aber sonst liegt dein Problem in der Kombination des JScrollPanes und der JTextArea !

Einmal vergrößert sieht die TextArea nicht freiwillig ein sich wieder zu verkleinern.
Das wird dem ScrollPane über den LayoutManager des darin enthaltenen Panels
mitgeteilt. Denn das Panel sagt dem ScrollPane lieber
"Mach mal dein ViewPort größer !" als das es der TextArea wieder den Platz wegnimmt !
Worauf dann das ScrollPane frech seine Slider auspackt ! :)

Eine Lösung dazu ist vom konkreten Fall abhängig !

Gruß JAdix
 
Vielen dank für deine Antwort.

Ja, das eine add(jsp) in zeile 38 ist zu viel, aber tut ja nicht soviel zur Sache da das alte überschrieben wird.

Tja, so konkret kann ich es gar nicht benennen das "vielleicht" auftretende Problem später einmal.
Eine Möglichkeit wäre es wohl zu prüfen, wie groß das aktuelle Fenster ist, alle anderen noch dargestellten Komponenten (bsp slitpane-dividor) ermitteln und von der Gesamtgröße abziehen und dann in PrefferedSize die Restmenge eintragen für das Panel. Wobei dann natürlich die JScrollbars überflüssig wären und nicht mehr zum Einsatz kommen. Ach manchmal ist es verzwickt mit Swing ^^.
Oder aber man setzt von Haus aus zumindest eine Minimalgröße des JPanels und wenn der Benutzer das Fenster kleiner machen will, kommen die Balken eben. Würde also bedeuten, dass ich mein Fenster beliebig groß schieben könnte und wieder verkleinern, aber ab einer gewissen Größe (die manuell festgelegte) kommen die Sliders eben.

Damit glaube ich mein Problem gelöst zu haben, wenn auch mit kleinem Umweg. Wenn du oder wer anders noch eine andere Idee hat, nur zu :)

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
 

public class PanelTest extends JFrame {

    public static void main(String args[]){
        new PanelTest().setPanel();
    }

    public void setPanel(){
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent evt) {
                System.exit(0);
            }
        });
        
        this.setLayout(new BorderLayout());
        this.setSize(300, 300);     

        JPanel pa_frame = new JPanel(new BorderLayout());
        pa_frame.setPreferredSize(new Dimension(200,200));
        
        JScrollPane jsp = new JScrollPane(pa_frame);
        
        this.setContentPane(jsp);

        JTextArea ta_text = new JTextArea();
        ta_text.setLineWrap(true);
        ta_text.setWrapStyleWord(true);

        pa_frame.add(ta_text);

        this.setVisible(true);
    }
}
 
Zuletzt bearbeitet:
Zurück