JScrollPane

di il
1 risposte

JScrollPane

Salve a tutti,
vorrei utilizzare una scroolbar, a video mi compare la finestra con la scroolbar ma non funziona lo scorrimento verticale.
Non capisco dove sbaglio, il codice sorgente è il seguente:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

	public class GUI {
		
		static int rows = 0;
		public static void main(String[] args) {
			JFrame frame = new JFrame("Prova scroolbar");
			frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
			
	        	JPanel panel1 = new JPanel();
	        	panel1.setLayout(new BorderLayout());
	       
	        	JButton button = new JButton("Try");
	        
	        	JPanel panel2 = new JPanel();
	        	panel2.add(button);

	        	panel1.add(panel2,BorderLayout.WEST);
	        
	        	JPanel panel3 = new JPanel();
	        	panel3.setPreferredSize(new Dimension(450,150));
	        	GridLayout layout = new GridLayout(rows,1);
	        	panel3.setLayout(layout);
	        
	        	JScrollPane scrollPane = new JScrollPane(panel3);
	        	scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

	        	button.addActionListener(new ActionListener() {
	        		public void actionPerformed(ActionEvent e) {
	            			layout.setRows(++rows);
	            			panel3.add(new JLabel("Try..."));
	                		frame.pack();
	                		frame.setVisible(true);
	            			}
				});
	        
	        	panel2.add(scrollPane);
	        	frame.add(panel1);
	        	frame.pack();
	        	frame.setVisible(true);
			}
}
Grazie.

1 Risposte

  • Re: JScrollPane

    java999 ha scritto:


    vorrei utilizzare una scroolbar, a video mi compare la finestra con la scroolbar ma non funziona lo scorrimento verticale.
    Non capisco dove sbaglio
    La questione è abbastanza semplice. Il JScrollPane contiene il panel3 e al panel3 hai settato un preferredSize esplicito di 450x150. E il panel3 ha anche un GridLayout.
    Il punto/problema è che GridLayout suddivide in N righe QUELLA dimensione che hai impostato. Ovverò farà 150 / 1riga .. 150 / 2righe ... 150 / 10righe ecc... Insomma, la dimensione di panel3 NON cambierà, cambierà invece la dimensione delle celle, che diventeranno sempre più piccole (e inutili ...).

    Se imposti il preferredSize di 450x150 al JScrollPane e NON al panel3, le cose cambiano leggermente e succede poi questo: il GridLayout continuerà a dividere le celle più o meno come prima MA quando la dimensione delle celle arriva al suo minimumSize "giusto", le celle NON diventeranno più piccole, restano al minimumSize. E man mano che il numero di celle aumenta, allora sfora dalla dimensione del viewport, quindi comparirà la scrollbar verticale e potrai scrollare.

    Dato che però questa non è una buona soluzione, la soluzione migliore è cambiare approccio. Invece di avere un GridLayout in panel3, ci metti un BoxLayout verticale (Y_AXIS). In questo modo le label Try staranno sempre al loro preferredSize e man mano che ne inserisci il pannello diventerà e sarà maggiormente scrollabile.
Devi accedere o registrarti per scrivere nel forum
1 risposte