ScrollPane: getPreferredSize()

Status
Nicht offen für weitere Antworten.

GreenLight

Mitglied
Hallo,

ich hab da mal eine Frage zur ScrollPane. Gibt es eine Möglichkeit, dass die mir immer genau die Größe ausgibt, die benötigt wird, die das Fenster benötigen würde, um alles anzuzeigen und noch ohne Scrollbars auskommt?

Mit preferredSize() klappt das irgendwie nämlich nicht.
Die ScrollPane enthält ein JPanel, welches halt beliebig viele Elemente enthalten kann.

Sonnige Grüße und THX ;-)
 
Du musst die Größe der Scrollpane auf die Größe des inhaltenden JPanels setzen.

Kann aber auch ins Auge gehen, wenn das JPanel zu groß wird 🙂
 
Hi, thx.
ja hatte auch schon mit viewport rumgespielt, habe es jetzt aber auf relative einfache Weise gelöst.

Ich nehme das panel, welches von der scrollpane beinhaltet wird und addiere auf
die height noch 30 und auf die weight noch 100 drauf. dann passt es immer.

Aber warum gerade 30 und 100? Keine Ahnung, aber der Langzeittest hats es bestätigt ;-)
 
Aber warum gerade 30 und 100? Keine Ahnung, aber der Langzeittest hats es bestätigt ;-)
Das kann ich Dir nicht erklären, weil ich nicht genau weiß, was Du tust. Feste Größen hinzuzufügen funktioniert normaler Weise nur mit einem LookAndFeel. Und meist auch nur, wenn die Schriftarten gleich sind. Und ggf. die Monitoreinstellungen bzgl. Dots/Inch. Das ist also eigentlich keine Lösung.

Aber Deiner Erklärung entnehme ich, dass Du einen kleinen Denkfehler hast. Eine JScrollPane trägt einen JViewport. Mit diesem solltest Du gar nichts machen. Dieser JViewport wiederum trägt eine View (irgendein Component, in diesem Fall Dein Panel). Diese View (und nicht! der JViewport) bestimmt, wie groß die JScrollPane werden will. Der JScrollPane selbst (genauso wie dem JViewport) setzt Du am besten überhaupt keine Größenangaben. Dann stimmt auch die Größe.

Wenn Du das Verhalten der JScrollPane besser einstellen möchtest, dann sollte die View (wieder: nicht! der JViewport) das Scrollable-Interface implementieren.

Ebenius
 
Ausser er benutzt Null-Layout 😉
Das "am besten" schließt das aus!

Davon abgesehen: Selbst wenn man null-Layout benutzt, sollte man der JScrollPane keine Größe setzen, sondern diese lieber über doLayout() oder validate() auf dem JScrollPane berechnen lassen. Das JScrollPane bringt ja schließlich sein eigenes Layout wieder mit.

Ebenius
 
Zuletzt bearbeitet:
ja, da hab ich mich wohl falsch ausgedrückt. Mit dem Viewport habe ich auch nichts gemacht.
Mmmh, du hast recht, mit meinen festen Größen ist so nicht ganz das wahre. So hab ich es bis jetzt gemacht, dann wird es vielleicht klarer:

In der for-Schleife können halt beliebig viele Elemente stehen und dem Panel hinzugefügt werden.

Java:
public class test extends JFrame{

	private JPanel panelData;
	private JPanel panelButton;
	private JScrollPane scroll;
	
	public test(){
		
		panelData = new JPanel();
		panelButton = new JPanel();
		createButtonPanel( panelButton); //Panel mit FlowLayout und ein paar Buttons
		
		scroll = new JScrollPane( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
				  JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
		scroll.setViewportView( panelData);
		
		Container c = this.getContentPane(); 
		BorderLayout border = new BorderLayout();
		c.setLayout( border);
		c.add( panelButton, BorderLayout.SOUTH);
		c.add( scroll, BorderLayout.CENTER);
			
		GridBagLayout gbl = new GridBagLayout();
		panelData.setLayout( gbl);
		
		for( int i=0; i<BELIEBIG; i++){
			JTextField txtBeispiel = new JTextField();
			addComponent( panelData, gbl, txtBeispiel, x, y, 1, 1, 0, 0);
		}
		
		setSize();
	}
	
	private void setSize(){
		Dimension d = panelData.getPreferredSize();
		Dimension dScreenSize = Toolkit.getDefaultToolkit().getScreenSize();
	    Dimension b = panelButton.getPreferredSize();
	    
	    d.height = (int) ((d.height + b.height) + 30);
	    d.width = (int) ((d.width + b.width) + 100);
	    
	    if( d.height > dScreenSize.height){
	    	d.height = dScreenSize.height;
	    }
	    
	    if( d.width > dScreenSize.width){
	    	d.width = dScreenSize.width;
	    }
	    
	    super.setSize( d);
	}
}
 
Achso. Du machst doch dort was ganz anderes... Du setzt die Größe des Fensters. Ein Fenster hat natürlich auch noch eine Titelleiste und einen Rahmen. Und Dein Button im Süden will natürlich auch Platz. Deswegen brauchst Du die zusätzlichen 100 / 30 px. Ist auch mit jedem System × LookAndFeel unterschiedlich.

Wenn Du die ScreenSize als Grenze verwendest, solltest Du auch noch die ScreenInsets (zum Beispiel wegen der Start-Leiste im Windows) abziehen.

Ansonsten: Benutz doch einfach pack(), das macht das Layout in genau der richtigen Größe. Danach kannst Du dann die Größe des Fensters ggf. noch gegen die Grenzwerte korrigieren.

HTH, Ebenius
 
Ansonsten: Benutz doch einfach pack(), das macht das Layout in genau der richtigen Größe. Danach kannst Du dann die Größe des Fensters ggf. noch gegen die Grenzwerte korrigieren.

Genau, das hab ich gesucht - nur irgenwie in der javadoc übersehen! THX. :toll:

Zu pack aber noch eine kleine Frage: Die Fenster werden toll, nur JTextFields, die noch unbefüllt sind werden im Prinzip nicht richtig dargestellt. Die sind im Prinzip nur ein kleiner weißer Strich. Sollte ich für jedes dieser TextFelder von vornherein eine PreferredSize setzen, oder geht das auch anders?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben