Swing Container vergrößern und verkleinern

Infomatrixx

Grünschnabel
Hallo zusammen,

ich bin gerade dabei eine Komponenten zu schreiben, bei der man eine Containerstruktur vrgrößern und verkleinern können soll.

Das heißt ich habe zum Beispiel sowas:

-> JPanel (Verwendet verschiedene LayoutManager)
---> JTextField
---> JButton
---> JPanel (Verwendet verschiedene LayoutManager)
-------> JButton

Nun war mein Ansatz zu sagen, dass ich bei einer Resize Operation Beim Rootelement (hier: JPanel) beginne und dann rekursiv über getComponents mich nach unten arbeite.

Bei jeder Komponente ändere ich nun die Größe immer um den gleichen Faktor mit setPreferedSize. Leider scheint das nicht zu funktionieren. Also nach dem Ändern der Komponente und dem erneuten Aufruf von getPreferedSize bekomme ich die geänderten Werte zurück, aber auf der Oberfläche hat sich nichts verändert.

Hier mal der Codeschipsel:

Code:
	private boolean calculate(JComponent comp, double factor, double lastFactor) {
		Component[] children = comp.getComponents();
		
		System.out.println("----\n" + comp.toString());
		System.out.println("Before: " + comp.getPreferredSize());
		
		Dimension dimension = comp.getPreferredSize();
		
		double oldWidth = (double)dimension.getWidth();
		double oldHeight = (double)dimension.getHeight();
		
		double newWidth = (oldWidth / lastFactor) * factor;
		double newHeight = (oldHeight / lastFactor) * factor;
		
		comp.setPreferredSize(new Dimension((int)newWidth, (int)newHeight));
		
		System.out.println("After: " + comp.getPreferredSize());		
		
		for(int i=0; i<children.length; i++) {
			calculate((JComponent)children[i], factor, lastFactor);
		}
		
		return true;
	}


Jemand eine Idee ?


Gruß,

Fabian
 
Hallo,

probiere es mal mit JFrame.pack() und anschließender der repaint-Methode, nachdem du die Größe verändert hast.
Durch das pack() werden die Größen und Ausrichtungen für alle Componenten im Fenster neu berechnet.
Mit dem repaint() wird das Fenster dann neu gezeichnert.

Von alleine ändert sich die GUI nicht ;-)

MfG
hansmueller
 
Hallo,

probiere es mal mit JFrame.pack() und anschließender der repaint-Methode, nachdem du die Größe verändert hast.
Durch das pack() werden die Größen und Ausrichtungen für alle Componenten im Fenster neu berechnet.
Mit dem repaint() wird das Fenster dann neu gezeichnert.

Von alleine ändert sich die GUI nicht ;-)

MfG
hansmueller
Hi,

das hat leider nicht gebracht. Ich habe vor den Komponentenbaum noch ein JScrollPane sitzen. Kann die das repaint Verhalten beeinflussen?


Gruß,

Fabian
 
Ich habe vor den Komponentenbaum noch ein JScrollPane sitzen. Kann die das repaint Verhalten beeinflussen?

Nein, wenn du dein JFrame mit repaint() neu zeichnen läßt, wird nicht nur das Fenster, sondern auch alle Komponenten darin neu gezeichnet.

Es kann vielleicht auch an den LayoutManagern liegen. Manche von denen ignorieren die PreferredSize.
Evtl mußt du statt dessen (neben der PreferredSize auch) die MaximumSize verändern. (Das ist jetzt nur ins Blaue hineingeraten.)

MfG
hansmueller
 
Nein, wenn du dein JFrame mit repaint() neu zeichnen läßt, wird nicht nur das Fenster, sondern auch alle Komponenten darin neu gezeichnet.

Es kann vielleicht auch an den LayoutManagern liegen. Manche von denen ignorieren die PreferredSize.
Evtl mußt du statt dessen (neben der PreferredSize auch) die MaximumSize verändern. (Das ist jetzt nur ins Blaue hineingeraten.)

MfG
hansmueller

Ich habe jetzt auf jeder Komponente revalidate() aufgerufen, das funktioniert auch ...

Warum gibt es auch so viele verschieden Arten die Verhältnisse neu berechnen zu lassen?


gruß,

Fabian
 
Zurück